Qt 单进程应用, 已经启动后转为后台,如何再次激活并占据主窗口

棍不易丢 发布于 2016/04/23 13:57
阅读 387
收藏 0
Qt

    Qt单进程程序,已经启动后转为后台, 此时点击应用图标如何将应用激活并占据主窗口。

    针对这个问题我查了些资料,给出的流程是 show(), raise(), activateWindow(), 这么个流程,但显然没有效果,有大神给科普了, windows系统不允许程序从用户手中抢夺应用激活窗口。

    但是问题来了, 我的确发现有的程序可以做到这点。比如说windows最新版本的kodi, 打开kodi后,此时切换到桌面, 然后再点击kodi应用图标, 已经打开的kodi就会激活并占据主窗口。

    我通过win32拿到qt窗口的句柄, 然后用showWindow() 和 setForegroundWindow() 依然没有效果。

    那么问题来了, 有大神能给个解决思路么。

加载中
0
peterli
peterli
activateWindow()应该可以吧
0
棍不易丢
棍不易丢

引用来自“peterli”的评论

activateWindow()应该可以吧
程序是Qt 5.6, 试了是不行。
0
hehuim
hehuim
这个貌似要用到单例化吧,Qt Solutions里有一个QSingleApplication类。
0
棍不易丢
棍不易丢

引用来自“hehuim”的评论

这个貌似要用到单例化吧,Qt Solutions里有一个QSingleApplication类。
QSingleApplication 这个类商业版的才有。 我用的QLocalServer 和 QLocalSocket实现的,效果差不多, 就是最后激活应用和占据主窗口的操作无效。
0
u
ualy

直接上代码:


void app_has_run(HWND hwnd)
{
    HWND top = NULL;
    if ( NULL == hwnd )
    {
        return;
    }
    SendMessage(hwnd,WM_SYSCOMMAND,SC_RESTORE,0);
    top=GetLastActivePopup(hwnd);
    if ( NULL != top && GetForegroundWindow()!= top )
    {
        SetForegroundWindow(top);
    }
}



0
東條・スペンサー・咲
東條・スペンサー・咲

才知道原来Qt Solution里面有解决方案。之前实现过一个单例应用,借鉴了一下一个广泛的单例代码,然后修复了一个崩溃后无法重启的bug。

https://github.com/Kreogist/Mu/blob/master/src/sdk/knsingletonapplication.h

https://github.com/Kreogist/Mu/blob/master/src/sdk/knsingletonapplication.cpp

返回顶部
顶部