57 lines
1.9 KiB
Python
57 lines
1.9 KiB
Python
#!/usr/bin/env python3
|
|
"""Hilfsskript: zaehlt AzA-Empfang-Huelle und Kontakte-Fenster (Win32, ohne Patientendaten)."""
|
|
from __future__ import annotations
|
|
|
|
import ctypes
|
|
import sys
|
|
from ctypes import wintypes
|
|
|
|
EMPFANG_PREFIXES = ("AzA-Empfang", "AzA Empfang Chat")
|
|
KONTAKT_PREFIXES = ("AzA Kontakte",)
|
|
|
|
|
|
def _matches(title: str, prefixes: tuple[str, ...]) -> bool:
|
|
return any(title == p or title.startswith(p) for p in prefixes if p)
|
|
|
|
|
|
def count_azA_chat_windows() -> dict:
|
|
if sys.platform != "win32":
|
|
return {"error": "nur Windows"}
|
|
user32 = ctypes.windll.user32
|
|
empfang: list[tuple[int, int, str]] = []
|
|
kontakt: list[tuple[int, int, str]] = []
|
|
|
|
@ctypes.WINFUNCTYPE(ctypes.c_bool, wintypes.HWND, wintypes.LPARAM)
|
|
def _cb(hwnd, _lp):
|
|
visible = bool(user32.IsWindowVisible(hwnd) or user32.IsIconic(hwnd))
|
|
if not visible:
|
|
return True
|
|
buf = ctypes.create_unicode_buffer(320)
|
|
user32.GetWindowTextW(hwnd, buf, 320)
|
|
t = buf.value or ""
|
|
p = wintypes.DWORD()
|
|
user32.GetWindowThreadProcessId(hwnd, ctypes.byref(p))
|
|
pid = int(p.value)
|
|
if _matches(t, EMPFANG_PREFIXES):
|
|
empfang.append((int(hwnd), pid, t))
|
|
elif _matches(t, KONTAKT_PREFIXES):
|
|
kontakt.append((int(hwnd), pid, t))
|
|
return True
|
|
|
|
user32.EnumWindows(_cb, 0)
|
|
return {
|
|
"empfang_count": len(empfang),
|
|
"kontakt_count": len(kontakt),
|
|
"empfang": empfang,
|
|
"kontakt": kontakt,
|
|
}
|
|
|
|
|
|
if __name__ == "__main__":
|
|
r = count_azA_chat_windows()
|
|
print(f"Empfang-Huellen: {r.get('empfang_count', 0)}")
|
|
print(f"Kontakte-Fenster: {r.get('kontakt_count', 0)}")
|
|
for label, items in (("Empfang", r.get("empfang", [])), ("Kontakt", r.get("kontakt", []))):
|
|
for hwnd, pid, title in items:
|
|
print(f" {label}: HWND={hwnd} PID={pid} title={title!r}")
|