使程序只运行一个实例

//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;
}
原文地址:https://www.cnblogs.com/xslwm/p/7208937.html