Как принудительно вывести окно Qt на передний план после нажатия уведомленияC++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Как принудительно вывести окно Qt на передний план после нажатия уведомления

Сообщение Anonymous »

Я работаю над приложением для обмена сообщениями, использующим Qt5. При получении нового сообщения отображается уведомление Windows. Когда я нажимаю на уведомление, оно должно открыть окно приложения, что и происходит на самом деле. Но открытое окно не на переднем плане, поэтому, когда я начинаю печатать, окно оказывается не в фокусе и ничего не происходит. Мне нужно сначала нажать на окно, а затем начать печатать.
В настоящее время я использую следующий код, чтобы открыть окно приложения:

Код: Выделить всё

appWindow->setWindowState(static_cast(appWindow->windowState() & ~Qt::WindowMinimized));

const auto winId = appWindow->winId();

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

// Setting rights for the process to move window to foreground
// They get reset after user input
AllowSetForegroundWindow(ASFW_ANY);

// Getting window handles for QApp and currently active process
HWND  appWinHandle   = HWND(winId);
HWND  curWinHandle   = GetForegroundWindow();
DWORD appWinThreadID = GetCurrentThreadId();
DWORD curWinThreadID = GetWindowThreadProcessId(curWinHandle, NULL);

// Forcing qWindow raise by setting it to be topmost and releasing right after
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);

// Moving input thread from current process to qApp
// Simulate Alt press and release to ensure qApp process got focus
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 10 есть некоторые ограничения на открытие окон на переднем плане, но некоторые приложения (например, OutLook) работают так, как я хочу.

Подробнее здесь: https://stackoverflow.com/questions/793 ... tification
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»