Как получить 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])
Вывод:
['Безымянный — Блокнот']
Если в Блокноте открыть еще настройку параметров страницы, то список будет такой:
['Параметры страницы', 'Безымянный — Блокнот']
Комментариев нет:
Отправить комментарий