1. 设置互斥量,并查找窗口,在InitInstance()函数中实现
TCHAR szMuteName[] = _T("MySignleApp"); HANDLE hSingleTon = CreateMutex(NULL, FALSE, szMutexName); if(GetLastError() == ERROR_ALREADY_EXISTS) { HWND hwndPrevious = ::GetWindow(::GetDesktopWindow(), GW_CHILD); //查找先前实例的主窗口 while(::IsWindow(hwndPrevious)) { //检查窗口是否有预设的标记 //有,则是要查找的主窗口 if(::GetProp(hwndPrevious, m_pszExeName)//要用SetProp来设定标记,可在MainFrm的OnCreate函数中调用SetProp {
//窗口已经最小化,则恢复其大小
if(::IsIconic(hwndPrevious))
{
::ShowWindow(hwndPrevious, SW_RESTORE);
}
::SetForegroundWindow(hwndPrevious);//激活主窗口
::SetForegroundWindow(::GetLastActivePopup(hwndPrevious));//激活主窗口的对话框
return FALSE;//退出本实例
}
hwndPrevious = ::GetWindow(hwndPrevious, GW_HWNDNEXT);//查找下一个窗口 }
return FALSE;//前一个实例已经存在,但找不到其主窗口,退出实例 }
2. 设置标记,在MainFrame的OnCreate()函数中
::SetProp(m_hWnd, theApp.m_pszExeName, (HANDLE)1);
3. 在程序关闭时去掉标记,可在OnClose()函数中实现
::RemoveProp(m_hWnd, theApp.m_pszExeName);