简体   繁体   中英

Open Qt MainWindow on top of every other window in single instance Qt application version 5.11.1 in Visual Studio

I have made single instance running Qt application (Qt version 5.11.1) in Visual Studio . Once it executed the first time, my main window will open and I am closing it. It keeps running in the background.

When I run .exe the second time, I want to open the previous mainWindow which I opened the first time.

I am enumerating available windows title and I am getting "Test Window" title. but using this HWND I am trying to set in the foreground on top of every other window using 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
}

How do I open on Qt MainWindow on top of all other windows when I run second time.

check out the project QtSingleApplication found in https://github.com/qtproject/qt-solutions .

In QtSingleApplication class there is a method named activateWindow . In the Loader Example this method gets called whenever a second instance of the program is run.

To make the main window go on top when you try to open a second instance you've got to modify this method like this.

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);
    }
}

Warning: this is a windows-only solution and it works on my machine. Be also sure to include windows.h in the implementation.

[edit] My code had the problem that once activated, window stayed to the fore. This hack sort of fixes it.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM