使程序只运行一个实例
//APP 里面
//1.
// 此程序只能运行一次,用互斥量来判断程序是否已运行
1 HANDLE m_hMutex=CreateMutex(nullptr,TRUE, m_pszAppName); 2 if(GetLastError()==ERROR_ALREADY_EXISTS) { return FALSE; }
//2.
1 HWND hWnd = FindWindow(nullptr, m_pszAppName/*_T("MyDlg")*/); //第一个参数: 窗口的类名 第二个参数: 窗口名称(标题)即m_pszAppName 2 if (IsWindow(hWnd)) 3 { 4 ::MessageBox(nullptr, _T("已经有一个实例在运行了!"), _T("提示"), MB_OK); 5 ::ShowWindow(hWnd, SW_NORMAL); // 显示 6 ::SetForegroundWindow(hWnd); // 激活 7 return FALSE; 8 }
3.
BOOL CheckAppRunning() { // 用应用程序名创建信号量 或者创建 互斥量 HANDLE hSem = CreateSemaphore(NULL, 1, 1, m_pszExeName); if (GetLastError() == ERROR_ALREADY_EXISTS) { // 关闭信号量句柄 CloseHandle(hSem); // 寻找先前实例的主窗口 HWND hWndPrevious = ::GetWindow(::GetDesktopWindow(), GW_CHILD); while (::IsWindow(hWndPrevious)) { // 检查窗口是否有预设的标记? // 有,则是我们寻找的主窗 if (::GetProp(hWndPrevious, m_pszExeName)) { // 主窗口已最小化,则恢复其大小 if (::IsIconic(hWndPrevious)) ::ShowWindow(hWndPrevious, SW_RESTORE); // 将主窗激活 ::SetForegroundWindow(hWndPrevious); // 将主窗的对话框激活 ::SetForegroundWindow(::GetLastActivePopup(hWndPrevious)); // 退出本实例 return TRUE; } // 继续寻找下一个窗口 hWndPrevious = ::GetWindow(hWndPrevious, GW_HWNDNEXT); } // 前一实例已存在,但找不到其主窗 // 可能出错了 // 退出本实例 return TRUE; } return FALSE; }