BOOL CWinApp::InitInstance()
{
if(FindInstance()) return FALSE;
........................................................
..........................................................
............................................................
::SetProp(pMainFrame->m_hWnd,ID_SINGLE,(HANDLE)1); }
BOOL CWinApp::FindInstance() { //用应用程序名创建信号量 m_hSem = CreateSemaphore(NULL,1,1,ID_SINGLE);//m_pszExeName //信号量存在,则程序已有一个实例运行 if(GetLastError() == ERROR_ALREADY_EXISTS) { //关闭信号量句柄 ::CloseHandle(m_hSem); m_hSem = NULL; //寻找先前实例的主窗口 HWND hWndPrevious = NULL; ::EnumWindows(EnumWndProc,(LPARAM)&hWndPrevious); if(hWndPrevious) { if(!::IsWindowVisible(hWndPrevious)) ::PostMessage(hWndPrevious, WM_COMMAND,SW_NORMAL , 0); / if(::IsIconic(hWndPrevious)) ::ShowWindow(hWndPrevious,SW_RESTORE); ::SetForegroundWindow(hWndPrevious); ::SetForegroundWindow(::GetLastActivePopup(hWndPrevious)); }
//退出本实例 return TRUE; }
return FALSE; }
///枚举窗口的函数 BOOL CALLBACK EnumWndProc(HWND hwnd,LPARAM lParam) { if(::GetProp(hwnd,ID_SINGLE)) { *(HWND*)lParam = hwnd; return false; } return true; }