如何保证一个程序在一台机器上只能同时存在一个进程?下面给出解决方案
1.在VS2010/MFC中创建一个基于对话框的工程MutexRun。
2.在BOOL CMutexRunDlg::OnInitDialog()最下面添加如下代码:
::SetProp( this->m_hWnd, L"MutexRun", (HANDLE)1 );
3.在BOOL CMutexRunApp::InitInstance()中最前面添加如下代码
HANDLE dlgHandle = ::CreateMutex( NULL, FALSE, m_pszExeName); //CWinApp中的成员函数,数值是程序本身的名字。
if( GetLastError() == ERROR_ALREADY_EXISTS )
{
CloseHandle( dlgHandle );
AfxMessageBox(L"该应用程序已经存在!");
dlgHandle= NULL;
HWND hWndPrevious = ::GetWindow(::GetDesktopWindow(), GW_CHILD);
while (::IsWindow(hWndPrevious))
{
// 检查窗口是否有预设的标记
// 有,则是我们寻找的主窗
if (::GetProp(hWndPrevious, m_pszExeName)) //要想成功显示出来下面的缺一不可
{
// 主窗口已最小化,则恢复其大小
if (::IsIconic(hWndPrevious))
::ShowWindow(hWndPrevious,SW_SHOWNORMAL);
::ShowWindow(hWndPrevious, SW_RESTORE);
// 将主窗激活
::SetForegroundWindow(hWndPrevious);
// 将主窗的对话框激活
::SetForegroundWindow(::GetLastActivePopup(hWndPrevious));
// 退出本实例
return FALSE;
}
// 继续寻找下一个窗口
hWndPrevious = ::GetWindow(hWndPrevious, GW_HWNDNEXT);
}
return FALSE;
}
编译运行,点击最小化按钮,最小化后,重新打开MutexRun.exe即看到效果。
具体代码见:http://download.youkuaiyun.com/detail/xiaxiaojing/8471257