как проверить имеет ли процесс 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.

→ Ссылка