Откройте Qt MainWindow поверх всех остальных окон в единственном экземпляре приложения Qt версии 5.11.1 в Visual Studio - PullRequest
0 голосов
/ 28 сентября 2018

Я создал один экземпляр, запускающий приложение Qt (Qt версия 5.11.1) в Visual Studio .После первого запуска откроется главное окно, и я его закрываю.Он продолжает работать в фоновом режиме.

Когда я запускаю .exe второй раз, я хочу открыть предыдущее главное окно, которое я открыл в первый раз.

Я перечисляю заголовок доступных окон и яполучаю "Тестовое окно" заголовок.но используя это 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 поверх всех других окон при втором запуске.

1 Ответ

0 голосов
/ 28 сентября 2018

проверьте проект QtSingleApplication, найденный в https://github.com/qtproject/qt-solutions.

В классе QtSingleApplication есть метод с именем activWindow .В примере 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.h .

[править] В моем коде была проблема, которая после активации окна оставалась на переднем плане.Этот взлом исправляет это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...