zoukankan      html  css  js  c++  java
  • win应用只允许单个实例运行,并将已运行实例窗口置顶

    关键词:windows,c++,桌面应用,单个实例,窗口置顶

    目标:1.判断本程序是否已有一个实例在运行。2.若有,则激活已在运行的实例(将其窗口置顶),并退出当前运行。

    1.使用semaphore来检测是否已有实例在运行(也可以用mutex,文件等其他方式)

    HANDLE g_hSingleSema = ::CreateSemaphore(NULL, 1, 1, _T("single_myapp_sema"));
        if (g_hSingleSema && ERROR_ALREADY_EXISTS == GetLastError()) {
        // 查找窗口,激活已运行实例,并退出当前运行
    }

    2.使用FindWindow()来得到已运行实例的窗口句柄

    HWND WINAPI FindWindow(
        _In_opt_  LPCTSTR lpClassName,
        _In_opt_  LPCTSTR lpWindowName
      );

    这里我们已经知道ClassName,所以可以直接用ClassName来找到已有的窗口。

    HWND hWnd = ::FindWindow(_T("MyAppClassName"), NULL);

    然后使用SetForegroundWindow()来激活已运行实例:

    ::SetForegroundWindow(hWnd);

    3.最后程序退出时记得ReleaseSemaphore()并关闭句柄。

    参考:

    1.http://xbi847ux.iteye.com/blog/1361639

    2.http://blog.csdn.net/starlee/article/details/1534489

  • 相关阅读:
    networkX用法整
    在人生路上对我影响最大的三位老师
    介绍自己
    介绍自己
    自我介绍
    打印沙漏1
    介绍自己
    对我影响最大的三位老师
    人生路上影响对我最大的三位老师
    1.自我介绍
  • 原文地址:https://www.cnblogs.com/bugchecker/p/run_single_instance_of_an_application_on_windows.html
Copyright © 2011-2022 走看看