Задать вопрос
@iamvitya

C++/Qt5. Как принудительно передать окну фокус?

Я работаю над приложением которое представляет из себя мессенджер. Когда приходит сообщение то при помощи QSystemIconTray отображается сообщение об этом. Уведомления нормально отображаются. Когда я жму на уведомление то по сигналу MessageClicked() открывается окно приложения. Однако после открытия окно находится не в фокусе, а при попытке напечатать что-то в поле ввода ни к чему не приводит. Реагировать приложение начинает только после нажатия на него.
Для попытки открыть окно на переднем плане я пока использую текущей код:
appWindow->setWindowState(static_cast<Qt::WindowState>(appWindow->windowState() & ~Qt::WindowMinimized));

    const auto winId = appWindow->winId();

#ifdef Q_OS_WIN
    QWindowsWindowFunctions::setWindowActivationBehavior(QWindowsWindowFunctions::AlwaysActivateWindow);
    appWindow->requestActivate();


    AllowSetForegroundWindow(ASFW_ANY);

    HWND  appWinHandle   = HWND(winId);
    HWND  curWinHandle   = GetForegroundWindow();
    DWORD appWinThreadID = GetCurrentThreadId();
    DWORD curWinThreadID = GetWindowThreadProcessId(curWinHandle, NULL);


    SetWindowPos(appWinHandle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE);
    SetWindowPos(appWinHandle, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE);

    AllowSetForegroundWindow(curWinThreadID);



    keybd_event(VK_MENU, 0, 0, 0);
    SetForegroundWindow(appWinHandle);
    keybd_event(VK_MENU, 0, KEYEVENTF_KEYUP, 0);
    AttachThreadInput(curWinThreadID, appWinThreadID, FALSE);
    SetFocus(appWinHandle);
    SetActiveWindow(appWinHandle);

Но всё равно не помогает. Насколько я знаю в Windows есть ограничения на то, какое приложение может захватить фокус. Однако я видел что многие другие приложения открываются в фокусе после нажатия на их уведомления в центре уведомлений. При этом получается довольно странно, что если пользователь жмет на уведомление от приложения в центре уведомлений то это не считается пользовательским вводом.
Есть ли какие-нибудь способы исправить это ?
  • Вопрос задан
  • 38 просмотров
Подписаться 1 Средний Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы