【问题标题】:Open Qt MainWindow on top of every other window in single instance Qt application version 5.11.1 in Visual Studio在 Visual Studio 中的单实例 Qt 应用程序版本 5.11.1 中,在每个其他窗口的顶部打开 Qt MainWindow
【发布时间】:2019-03-04 12:18:10
【问题描述】:

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

当我第二次运行.exe时,我想打开我第一次打开的前一个主窗口。

我正在枚举可用的窗口标题,我得到 "Test Window" 标题。但是使用这个 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 上打开。

【问题讨论】:

    标签: c++ windows qt winapi


    【解决方案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 可以修复它。

    【讨论】:

    • 我使用的是 qt 版本 5.11.1。在这个版本中,他们删除了这个 QtSingleApplication
    • 你可以从我提供的网站上得到它。 git-clone 项目,尝试运行 loader 应用并实施修改。我在 5.11.1 上测试过
    • 这不会使窗口成为前景窗口,这显然是 OP 试图做的。
    • 据我了解,Narendra 想要的是当单击应用程序图标时,如果它正在运行,它的窗口就会出现,这就是我编辑的 Loader版本> 会。我的机器是Win10,Qt 5.11.1
    • 您需要了解foreground and background windows 是什么。您提出的解决方案将一个窗口放在前面(有点),但没有使其成为前景窗口。人们确实使用键盘;不要假设鼠标激活是唯一的激活类型(尽管 Qt 已经被破坏了,但看起来确实如此)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多