Я реализую замену на панели задач, например, в стиле приложения. Он делает некоторые уникальные вещи с OpenGL и с быстрыми клавишами, поэтому так, как он настраивается, окно не всегда имеет фокус. Я хотел бы реализовать его таким образом, чтобы я мог принести произвольное окно на передний план, подобно панели задач или программе ALT-TAB.
Однако мой код просто заставляет значок приложения мигать на панели задач. В документации по API Windows говорится, что это то, что должно произойти, но я ищу способ обойти это.
Я адаптировал свой код из следующих примеров, которые говорят, что привязка к потоку переднего плана должна позволять вам устанавливать окно переднего плана. Вот сайты:
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, но если есть решение на другом языке, я буду использовать обертки или сделать все, что необходимо для его запуска и запуска.
Спасибо заранее!
EDIT:. Я был бы открыт для того, чтобы он работал только на моем конкретном компьютере, то есть на том, чтобы включить на моей машине способ для любого фокуса приложения.
РЕШЕНО:. Вам нужно отключить блокировку переднего плана. Оказывается, это было так просто:
win32gui.SystemParametersInfo(win32con.SPI_SETFOREGROUNDLOCKTIMEOUT, 0, win32con.SPIF_SENDWININICHANGE | win32con.SPIF_UPDATEINIFILE)