Как программно активировать окно в Windows с помощью Python? Я посылаю на него нажатия клавиш, и в настоящий момент я просто проверяю, чтобы последнее приложение использовалось, а затем нажатие клавиши Alt + Tab переключилось на него с консоли DOS. Есть ли лучший способ (поскольку я узнал по опыту, что этот способ ни в коем случае не является надежным)?
Активация окна Python
Ответ 1
Вы можете использовать модуль win32gui для этого. Сначала вам нужно получить действительный дескриптор в вашем окне. Вы можете использовать win32gui.FindWindow
, если знаете имя класса окна или точный заголовок. Если нет, вы можете перечислить окна с помощью win32gui.EnumWindows
и попытаться найти правильный.
Как только у вас есть дескриптор, вы можете вызвать win32gui.SetForegroundWindow
с помощью дескриптора. Он активирует окно и будет готов к нажатию клавиш.
См. пример ниже. Я надеюсь, что это поможет
import win32gui
import re
class WindowMgr:
"""Encapsulates some calls to the winapi for window management"""
def __init__ (self):
"""Constructor"""
self._handle = None
def find_window(self, class_name, window_name=None):
"""find a window by its class_name"""
self._handle = win32gui.FindWindow(class_name, window_name)
def _window_enum_callback(self, hwnd, wildcard):
"""Pass to win32gui.EnumWindows() to check all the opened windows"""
if re.match(wildcard, str(win32gui.GetWindowText(hwnd))) is not None:
self._handle = hwnd
def find_window_wildcard(self, wildcard):
"""find a window whose title matches the wildcard regex"""
self._handle = None
win32gui.EnumWindows(self._window_enum_callback, wildcard)
def set_foreground(self):
"""put the window in the foreground"""
win32gui.SetForegroundWindow(self._handle)
w = WindowMgr()
w.find_window_wildcard(".*Hello.*")
w.set_foreground()
Ответ 2
Pywinauto и SWAPY, вероятно, потребуют наименьших усилий , чтобы установить фокус окна.
Используйте SWAPY для автоматической генерации кода Python, необходимого для извлечения объекта окна, например:
import pywinauto
# SWAPY will record the title and class of the window you want activated
app = pywinauto.application.Application()
t, c = u'WINDOW SWAPY RECORDS', u'CLASS SWAPY RECORDS'
handle = pywinauto.findwindows.find_windows(title=t, class_name=c)[0]
# SWAPY will also get the window
window = app.window_(handle=handle)
# this here is the only line of code you actually write (SWAPY recorded the rest)
window.SetFocus()
Если случайно другие окна находятся напротив интересующего вас окна, это не проблема. Этот дополнительный код или этот обеспечит его показ перед запуском вышеуказанного кода:
# minimize then maximize to bring this window in front of all others
window.Minimize()
window.Maximize()
# now you can set its focus
window.SetFocus()
Ответ 3
import ctypes, platform
if platform.system() == 'Windows':
Active_W = ctypes.windll.user32.GetActiveWindow()
ctypes.windll.user32.SetWindowPos(Active_W,0,0,0,0,0,0x0002|0x0001)
Здесь мы идем. вам просто нужно сохранить значение активного окна.