Страницы

Поиск по вопросам

суббота, 11 января 2020 г.

Как получить hwnd по имени процесса?

#python #python_3x #winapi #pywin32


Как получить hwnd окна по имени процесса. Вот например я могу получить hwnd по имени окна

hwnd = win32gui.FindWindow(None, "Notepad")


Можно ли так же легко получить hwnd по имени процесса?
    


Ответы

Ответ 1



Совсем просто не получится, потому что: Может быть несколько процессов с одним именем (например, можно открыть несколько окон Блокнота). У процесса может быть несколько окон Поэтому сначала нужно получить список процессов с заданными именем файла (или для простоты первый попавшийся процесс, подходящий по этому условию), потом список окон для данного процесса (процессов). 1. Получаем список процессов, у которых имя файла равно notepad.exe Можно воспользоваться пакетом psutil import psutil # Список процессов с именем файла notepad.exe: notepads = [item for item in psutil.process_iter() if item.name() == 'notepad.exe'] print(notepads) # [] # Просто pid первого попавшегося процесса с именем файла notepad.exe: pid = next(item for item in psutil.process_iter() if item.name() == 'notepad.exe').pid # (вызовет исключение StopIteration, если Блокнот не запущен) print(pid) # 4416 2. Получаем список окон процесса с заданным pid Чтобы получить список окон процесса, можно воспользоваться функцией EnumWindows. Например, нужно получить все окна процесса с ID 4416: import win32gui import win32process def enum_window_callback(hwnd, pid): tid, current_pid = win32process.GetWindowThreadProcessId(hwnd) if pid == current_pid and win32gui.IsWindowVisible(hwnd): windows.append(hwnd) # pid = 4416 # pid уже получен на предыдущем этапе windows = [] win32gui.EnumWindows(enum_window_callback, pid) # Выводим заголовки всех полученных окон print([win32gui.GetWindowText(item) for item in windows]) Вывод: ['Безымянный — Блокнот'] Если в Блокноте открыть еще настройку параметров страницы, то список будет такой: ['Параметры страницы', 'Безымянный — Блокнот']

Комментариев нет:

Отправить комментарий