Как программно вызвать Qt Window / Widget, когда не активное приложение (windows)? - PullRequest
0 голосов
/ 10 февраля 2020

У меня есть приложение, в котором есть несколько процессов с GUI компонентами, которые должны координироваться, как если бы они были одним процессом (давайте назовем это GUI системой и скажем, что она использует TCP-сокеты для координации компонентов).

С этой целью, если одно окно в системе активировано, всем остальным windows в системе будет отправлено сообщение, чтобы убедиться, что они поднимаются над любым окном, не принадлежащим нашей GUI системе.

Похоже, что самое близкое, что я могу сделать в чисто нативном Qt, это вызвать QWidget.activateWindow (). Различные другие команды, например, show, Повышение, не работают, если процесс не является активным Windows процессом.

Проблема с наличием всех других окон windows, активирующих вызов, состоит в том, что он отвлекает внимание из окна, которое я только что щелкнул, что делает это окно непригодным для использования (если только я не вызову его как активировать, когда все другие процессы завершили свою команду активации - но это вносит большую сложность и хрупкость).

1 Ответ

1 голос
/ 10 февраля 2020

Пытаясь решить мою проблему, я нашел там много людей с похожими проблемами.

Может показаться, что нет собственного способа вызова Qt, когда не активен процесс.

Многие указывают на использование win32 API, но было трудно найти все детали того, как смешать PyQt и win32 API, чтобы просто вывести окно на передний план, когда не активное приложение, поэтому вот моя лучшая попытка:

import win32gui
import win32con

hwnd = self.widget.winId()
win32gui.SetWindowPos(hwnd, win32con.HWND_TOPMOST, 0, 0, 0, 0, win32con.SWP_NOMOVE | win32con.SWP_NOACTIVATE)
win32gui.SetWindowPos(hwnd, win32con.HWND_NOTOPMOST, 0, 0, 0, 0, win32con.SWP_NOMOVE | win32con.SWP_NOACTIVATE)

Я ненавижу, что требуется два звонка, но, похоже, это работает.

...