как проверить имеет ли процесс GUI?
допустим есть вот такой цикл:for proc in psutil.process_iter():
как проверить, имеет ли proc GUI, и можно ли вообще получить чисто список программ имеющих GUI?
P.S: нужно получать только запущенные процессы испольщующие GUI
Ответы (1 шт):
Автор решения: eri
→ Ссылка
Принцип один и тот же: спрашиваем ОС информацию обо всех окнах и достаем из окна pid. По функции winpids уже получишь список процессов и process_iter уже не нужна, но оставил для примера.
Xorg (Linux):
Установка
pip3 install python-xlib psutil
Код:
def winpids():
from Xlib import display
from Xlib.X import AnyPropertyType
from Xlib.protocol.request import InternAtom
root = display.Display().screen().root
query = root.query_tree()
for window in query.children:
atom = InternAtom(display=window.display, name="_NET_WM_PID", only_if_exists=1)
pid = window.get_property(atom.atom, AnyPropertyType, 0, 10)
if pid:
pid = pid.value.tolist()[0]
yield pid
def procs():
import psutil
guiprocs = set(winpids())
for proc in psutil.process_iter():
if proc.pid in guiprocs:
print( proc )
procs()
Win32 (Windows):
Проверял python3.10, pywin32-304, windows 11.
Установка
pip install pywin32 psutil
Хотя pywin32 лучше ставить через установщик https://github.com/mhammond/pywin32/releases/
Код
def winpids():
import win32gui
import win32process
pids = []
def winEnumHandler(hwnd, ctx):
pid = win32process.GetWindowThreadProcessId(hwnd)
pids.append(pid[1])
win32gui.EnumWindows(winEnumHandler, None)
return pids
def procs():
import psutil
guiprocs = set(winpids())
for proc in psutil.process_iter():
if proc.pid in guiprocs:
print( proc )
procs()
На Виндовс возможно ещё есть что-то через COM.