2026-03-09 21:42:02 +03:00
|
|
|
|
import win32gui
|
2026-03-10 00:44:46 +03:00
|
|
|
|
import win32process
|
|
|
|
|
|
import psutil
|
2026-03-10 01:40:10 +03:00
|
|
|
|
from .base import PlatformBase, WindowInfo
|
2026-03-09 21:42:02 +03:00
|
|
|
|
|
|
|
|
|
|
|
2026-03-10 01:40:10 +03:00
|
|
|
|
class WindowsPlatform(PlatformBase):
|
|
|
|
|
|
def get_active_window(self) -> WindowInfo:
|
2026-03-09 21:42:02 +03:00
|
|
|
|
try:
|
2026-03-10 01:40:10 +03:00
|
|
|
|
hwnd = win32gui.GetForegroundWindow()
|
|
|
|
|
|
if not hwnd:
|
|
|
|
|
|
return WindowInfo(title="", process_name="")
|
2026-03-09 21:42:02 +03:00
|
|
|
|
|
2026-03-10 01:40:10 +03:00
|
|
|
|
# Получаем заголовок окна
|
|
|
|
|
|
title = win32gui.GetWindowText(hwnd).strip()
|
2026-03-09 21:42:02 +03:00
|
|
|
|
|
2026-03-10 01:40:10 +03:00
|
|
|
|
# Получаем PID процесса
|
|
|
|
|
|
_, pid = win32process.GetWindowThreadProcessId(hwnd)
|
2026-03-09 21:42:02 +03:00
|
|
|
|
|
2026-03-10 01:40:10 +03:00
|
|
|
|
if pid == 0:
|
|
|
|
|
|
return WindowInfo(title=title, process_name="")
|
2026-03-09 21:42:02 +03:00
|
|
|
|
|
2026-03-10 01:40:10 +03:00
|
|
|
|
# Получаем имя исполняемого файла процесса
|
|
|
|
|
|
try:
|
|
|
|
|
|
process = psutil.Process(pid)
|
|
|
|
|
|
process_name = process.name()
|
|
|
|
|
|
except (psutil.NoSuchProcess, psutil.AccessDenied):
|
|
|
|
|
|
process_name = ""
|
2026-03-09 21:42:02 +03:00
|
|
|
|
|
2026-03-10 01:40:10 +03:00
|
|
|
|
return WindowInfo(title=title, process_name=process_name)
|
2026-03-09 21:42:02 +03:00
|
|
|
|
|
2026-03-10 01:40:10 +03:00
|
|
|
|
except Exception:
|
|
|
|
|
|
# В случае ошибки (например, недоступно окно) — возвращаем пустые данные
|
|
|
|
|
|
return WindowInfo(title="", process_name="")
|