Я реализую замену панели задач, подобную док-станции программу в стиле переключения приложений. Он делает некоторые уникальные вещи с OpenGL и с горячими клавишами, поэтому при настройке окно не всегда имеет фокус. Я хотел бы реализовать это так, чтобы я мог вывести произвольное окно на передний план, так же как панель задач или программа ALT-TAB.
Однако мой код просто заставляет значок приложения мигать на панели задач. В документации Windows API сказано, что это то, что должно произойти, но я ищу способ обойти это.
Я адаптировал свой код из следующих примеров, в которых говорится, что присоединение к потоку переднего плана должно позволить вам установить окно переднего плана. Вот сайты:
http://www.voidnish.com/Articles/ShowArticle.aspx?code=dlgboxtricks
http://invers2008.blogspot.com/2008/10/mfc-how-to-steal-focus-on-2kxp.html
Мой код выглядит следующим образом. Обратите внимание, что он использует оболочки win32 для python (self.hwnd - это дескриптор окна, которое я хочу вывести на передний план):
fgwin = win32gui.GetForegroundWindow()
fg = win32process.GetWindowThreadProcessId(fgwin)[0]
current = win32api.GetCurrentThreadId()
if current != fg:
win32process.AttachThreadInput(fg, current, True)
win32gui.SetForegroundWindow(self.hwnd)
win32process.AttachThreadInput(fg, win32api.GetCurrentThreadId(), False)
Однако, если мое окно не является окном переднего плана (что обычно не происходит), это просто заставляет значок программы мигать.
Я неправильно делаю нить? Есть ли другой способ обойти это? Я полагаю, что должно быть, так как есть много переключателей приложений, которые, кажется, могут сделать это просто отлично.
Я пишу это на python, но если есть решение на другом языке, я буду использовать обертки или делать все необходимое для запуска и запуска.
Заранее спасибо!
РЕДАКТИРОВАТЬ: Я был бы открыт для способа заставить его работать только на моем конкретном компьютере, то есть способ, чтобы на моей машине, способ для любого приложения, чтобы сосредоточиться. *
решено: Что вам нужно сделать, это отключить блокировку переднего плана. Оказывается, это было так просто:
win32gui.SystemParametersInfo(win32con.SPI_SETFOREGROUNDLOCKTIMEOUT, 0, win32con.SPIF_SENDWININICHANGE | win32con.SPIF_UPDATEINIFILE)