阿杰 发表于 2012-1-8 18:13:27

VC++防止重复运行同一个程序

通过事件对象来实现:
      HANDLE hEvent=CreateEvent(NULL,FALSE,FALSE,"OneEvent");
      if(hEvent)
      {
                if(GetLastError()==ERROR_ALREADY_EXISTS)
                {
                        ::AfxMessageBox(_T("已有程序在运行!"));
                        return FALSE;
                }
      
      }

或在App::InitInstance()中加入

CreateMutex(NULL, true ,m_pszAppName);
if (GetLastError() == ERROR_ALREADY_EXISTS)
{
AfxMessageBox(_T( "应用程序不可以重复启动" ),MB_OK | MB_APPLMODAL |MB_ICONSTOP);
return ( false );
}或///////////////////////////////<防止重复运行>///////////////////////////////////////////////
CString lpszName="proj Test";   //窗口的标题
      HANDLE   hMutex   =   NULL;
      hMutex   =   ::OpenMutex(MUTEX_ALL_ACCESS,TRUE,lpszName);
      if(hMutex)
    {
      

      
   CWnd *pWnd=CWnd::FindWindow(NULL,lpszName);//目标进程的窗口的captain
   if(pWnd)   
   {   
    if (para=="exit")
   pWnd->SendMessage(WM_MYMESSAGE_stop, NULL, NULL);      //给旧进程发送消息
    else{
   MessageBox(NULL, "您已经启动程序   !         ", "提示                                 ",MB_ICONINFORMATION);
    }
    //MessageBox(NULL,"找到窗口","提示",MB_ICONINFORMATION);
   } else{
    MessageBox(NULL, "您已经启动程序   !         ", "提示                                 ",MB_ICONINFORMATION);
   }

      return   FALSE;
    }
      hMutex   =   ::CreateMutex(NULL,TRUE,lpszName);
///////////////////////////////</防止重复运行>///////////////////////////////////////////////

Xor 发表于 2012-1-8 19:34:15

一些软件在重复启动时会自动激活已启动的窗口,I want to know something that can give the force to my old process

Tesla.Angela 发表于 2012-1-15 01:05:32

Xor 发表于 2012-1-8 19:34 static/image/common/back.gif
一些软件在重复启动时会自动激活已启动的窗口,I want to know something that can give the force to my o ...

这个简单了,直接FindWindow + SendMessage即可。
在我的MicroMusicPlayer里就是用的这种办法。

马大哈 发表于 2012-1-15 23:15:00

Xor 发表于 2012-1-8 19:34 static/image/common/back.gif
一些软件在重复启动时会自动激活已启动的窗口,I want to know something that can give the force to my o ...

还有一招,就是调用BroadcastSystemMessage广播一条你自己的特殊消息,然后你在子类化里收这个消息.

如果收到这消息,就说明有个实例已启动,并且在查询是否已有实例,那就返回个值让它知道已有实例了并退出.

同时还可以让自己激活一下.

qwert502 发表于 2012-3-16 14:29:05

互斥体。。。学习了
页: [1]
查看完整版本: VC++防止重复运行同一个程序