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

转载于:https://www.cnblogs.com/bugchecker/p/run_single_instance_of_an_application_on_windows.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值