Страницы

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

понедельник, 4 марта 2019 г.

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

Как получить hwnd окна по имени процесса. Вот например я могу получить hwnd по имени окна
hwnd = win32gui.FindWindow(None, "Notepad")
Можно ли так же легко получить hwnd по имени процесса?


Ответ

Совсем просто не получится, потому что:
Может быть несколько процессов с одним именем (например, можно открыть несколько окон Блокнота). У процесса может быть несколько окон
Поэтому сначала нужно получить список процессов с заданными именем файла (или для простоты первый попавшийся процесс, подходящий по этому условию), потом список окон для данного процесса (процессов).
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])
Вывод:
['Безымянный — Блокнот']
Если в Блокноте открыть еще настройку параметров страницы, то список будет такой:
['Параметры страницы', 'Безымянный — Блокнот']

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

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