Рубрики
Без рубрики

Pywin32 – Как принести окно вперед

Получите практические, реальные навыки Python на наших ресурсах и пути

Автор оригинала: Mike Driscoll.

Недавно я видел, как кто-то спрашивает, как принести окно на фронт в Windows, и я понял, что у меня был какой-то старый незаконченный код, который может помочь кому-то с этой задачей. Давным-давно Tim Golden (и, возможно, некоторые другие стипендии на списке рассылки Pywin32) показали мне, как сделать Windows на передней панели на Windows XP, хотя следует отметить, что он также работает на Windows 7. Если вы Хотелось бы следовать, вам нужно будет скачать и установить свою собственную копию Pywin32 Отказ

Нам нужно будет выбрать что-то, чтобы принести на фронт. Мне нравится использовать блокнот для тестирования, насколько я знаю, он будет на каждом рабочем столе Windows в наличии. Откройте блокнот, а затем поместите окно какого-либо другого приложения перед ним.

Теперь мы готовы посмотреть на какой-то код:

import win32gui

def windowEnumerationHandler(hwnd, top_windows):
    top_windows.append((hwnd, win32gui.GetWindowText(hwnd)))

if __name__ == "__main__":
    results = []
    top_windows = []
    win32gui.EnumWindows(windowEnumerationHandler, top_windows)
    for i in top_windows:
        if "notepad" in i[1].lower():
            print i
            win32gui.ShowWindow(i[0],5)
            win32gui.SetForegroundWindow(i[0])
            break

Нам нужны только pywin32 Win32Gui Модуль для этого маленького сценария. Мы пишем немного функции, которая принимает ручку окна и список Python. Затем мы называем Win32Gui’s Enumwindows Способ, который принимает обратный вызов и дополнительный аргумент, который является объектом Python. Согласно Документация Метод Enumwindows «перечисляет все окна верхнего уровня на экране, передавая ручку в каждое окно, в свою очередь, к функции обратного вызова на приложении». Таким образом, мы передаем это наш метод, и он перечисляет окна, передавая ручку каждого окна плюс наш список Python в нашу функцию. Это работает как испорченный декоратор.

Как только это сделано, ваш Top_windows Список будет полон многих предметов, большинство из которых вы даже не знали, работали. Вы можете распечатать, что наши и проверьте ваши результаты, если хотите. Это действительно вполне удобно. Но для наших целей мы пропустим это и просто петлю по списку, ищете слово «Блокнот». Как только мы найдем это, мы используем Win32Gui’s Showwindow и Setforegroundwindow Методы для привлечения приложения на передний план.

Обратите внимание, что действительно нужно искать уникальную строку, чтобы вы поднимали правильное окно. Что произойдет, если у вас был несколько экземпляров Notepad, работающий с разными файлами? С текущим кодом вы привели бы первый экземпляр Notepad, который он нашел вперед, что может быть не то, что вы хотите.

Вам может быть интересно, почему кто-то даже хотел бы пойти на неприятности этого в первую очередь. В моем случае у меня когда-то был проект, где мне пришлось принести определенное окно на передний план и ввести автоматизировать его с помощью SendKeys. Это был уродливый кусок хрупкого кода, который я никому не хотел. К счастью, есть лучшие инструменты для такого рода вещи, как Pywinauto , но вы все равно можете найти этот код полезным в чем-то эзотерике, который бросил свой путь. Повеселись!

Примечание. Этот код был протестирован с помощью Python 2.7.8 и Pywin32 219 на Windows 7.