找回密码
 加入我们

QQ登录

只需一步,快速开始

搜索
查看: 6628|回复: 4

[开源] VC++防止重复运行同一个程序

  [复制链接]

1214

主题

352

回帖

11

精华

管理员

菜鸟

积分
93755

贡献奖关注奖人气王精英奖乐于助人勋章

发表于 2012-1-8 18:13:27 | 显示全部楼层 |阅读模式
  1. 通过事件对象来实现:
  2.         HANDLE hEvent=CreateEvent(NULL,FALSE,FALSE,"OneEvent");
  3.         if(hEvent)
  4.         {
  5.                 if(GetLastError()==ERROR_ALREADY_EXISTS)
  6.                 {
  7.                         ::AfxMessageBox(_T("已有程序在运行!"));
  8.                         return FALSE;
  9.                 }
  10.         
  11.         }

复制代码
  1. 在App::InitInstance()中加入

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

  8.       
  9.    CWnd *pWnd=CWnd::FindWindow(NULL,lpszName);//目标进程的窗口的captain
  10.    if(pWnd)   
  11.    {   
  12.     if (para[1]=="exit")
  13.      pWnd->SendMessage(WM_MYMESSAGE_stop, NULL, NULL);      //给旧进程发送消息
  14.     else{
  15.      MessageBox(NULL, "您已经启动程序   !         ", "提示                                 ",MB_ICONINFORMATION);
  16.     }
  17.     //MessageBox(NULL,"找到窗口","提示",MB_ICONINFORMATION);
  18.    } else{
  19.     MessageBox(NULL, "您已经启动程序   !         ", "提示                                 ",MB_ICONINFORMATION);
  20.    }

  21.         return   FALSE;
  22.     }
  23.       hMutex   =   ::CreateMutex(NULL,TRUE,lpszName);
  24. ///////////////////////////////</防止重复运行>///////////////////////////////////////////////
复制代码
【VB】QQ群:1422505加的请打上VB好友
【易语言】QQ群:9531809  或 177048
【FOXPRO】QQ群:6580324  或 33659603
【C/C++/VC】QQ群:3777552
【NiceBasic】QQ群:3703755

40

主题

324

回帖

0

精华

铂金会员

Eax=0

积分
1575
发表于 2012-1-8 19:34:15 | 显示全部楼层
一些软件在重复启动时会自动激活已启动的窗口,I want to know something that can give the force to my old process
Do my best.

858

主题

2638

回帖

2

精华

管理员

此生无悔入华夏,  长居日耳曼尼亚。  

积分
36138
发表于 2012-1-15 01:05:32 | 显示全部楼层
Xor 发表于 2012-1-8 19:34
一些软件在重复启动时会自动激活已启动的窗口,I want to know something that can give the force to my o ...

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

275

主题

3019

回帖

1

精华

管理员

嗷嗷叫的老马

积分
17066

论坛牛人贡献奖关注奖最佳版主进步奖人气王疯狂作品奖精英奖赞助论坛勋章乐于助人勋章

QQ
发表于 2012-1-15 23:15:00 | 显示全部楼层
Xor 发表于 2012-1-8 19:34
一些软件在重复启动时会自动激活已启动的窗口,I want to know something that can give the force to my o ...

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

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

同时还可以让自己激活一下.
我就是嗷嗷叫的老马了......

0

主题

92

回帖

0

精华

铜牌会员

积分
166
发表于 2012-3-16 14:29:05 | 显示全部楼层
互斥体。。。学习了
您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

快速回复 返回顶部 返回列表