在Visual Studio中的单实例Qt应用程序版本5.11.1中,在所有其他窗口的顶部打开Qt MainWindow

时间:2018-09-28 13:22:19

标签: c++ windows qt winapi

我已在 Visual Studio 中使单个实例运行Qt应用程序(Qt版本5.11.1)。第一次执行后,我的主窗口将打开,我正在关闭它。它一直在后台运行。

第二次运行.exe时,我想打开我第一次打开的上一个mainWindow。

我正在枚举可用的窗口标题,并且正在获取“测试窗口” 标题。但是我想使用此 HWND 来使用SetForegroundWindow(hwnd);设置在每个其他窗口顶部的前景中。

BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)
{
    if (IsWindowVisible(hwnd)) // check whether window is visible
    {
        char wnd_title[256];
        GetWindowText(hwnd, wnd_title, sizeof(wnd_title));
        MessageBox(0, wnd_title, "Installation Error", MB_OK | MB_ICONEXCLAMATION);
        if (strcmp(wnd_title, "Test Window") == 0)      
        {

            SetForegroundWindow(hwnd);

            int err = GetLastError();
            string msg = "error code " + std::to_string(err);
            MessageBox(0, msg.c_str(),"Installation Error ",  MB_OK | MB_ICONEXCLAMATION);
            return false;
        }
    }
    return true; // function must return true if you want to continue enumeration
}

第二次运行时,如何在所有其他窗口顶部的 Qt MainWindow 上打开

1 个答案:

答案 0 :(得分:1)

检出在https://github.com/qtproject/qt-solutions中找到的项目QtSingleApplication。

在QtSingleApplication类中,有一个名为 activateWindow 的方法。在 Loader 示例中,只要运行程序的第二个实例,就会调用此方法。

要在尝试打开第二个实例时使主窗口位于顶部,必须像这样修改此方法。

void QtSingleApplication::activateWindow()
{
    if (actWin) {
        actWin->setWindowState(actWin->windowState() & ~Qt::WindowMinimized);
        actWin->activateWindow();
        actWin->raise();
        //winapi call
        SetWindowPos((HWND)actWin->winId() , HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
       //hack to prevent sticking window to the fore
       SetWindowPos((HWND)actWin->winId() , HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
    }
}

警告:这是仅Windows的解决方案,它可以在我的机器上使用。还要确保在实施中包括 windows.h

[edit]我的代码有一个问题,即一旦激活,窗口就会脱颖而出。这种hack修复。