在开发过程中会遇到只允许运行一个实例的情况。 今天对这个问题进行探讨。 |
大家都看过或者使用过类似只运行一个实例的程序,比如:QQ游戏、部分浏览器 等等! 让一个程序只运行一个实例的方法有多种,但是原理都类似,也就是在程序创建后,有窗口的程序在窗口创建前, 检查系统中是否已经设置了某些特定标志,是否创建了一些全局唯一的东西,或者让程序的多个实例都能看到的东西, 如果有则说明已经有一个实例在运行了,则当前程序通知用户如何如何,然后程序退出,当然方法有很多种,各有各的优缺点! |
- 方法一:
创建互斥体 Mutex 法:
但是单纯的使用互斥体的话不能取得已经创建的实例窗口局柄,因此无法激活已经启动的实例窗口;
HANDLE m_hMutex = ::CreateMutex(NULL, FALSE, _T("{6668BB0A-DE0C-499d-8520-79653FF9B2EB}"));
if ( GetLastError() == ERROR_ALREADY_EXISTS ){
AfxMessageBox(_T("已经有一个实例正在运行中……"));
CloseHandle(m_hMutex);
m_hMutex = NULL;
return FALSE;
}
if (m_hMutex) {
CloseHandle(m_hMutex);
m_hMutex =