Insild Asked:2022-08-26 18:51:44 +0800 CST2022-08-26 18:51:44 +0800 CST 2022-08-26 18:51:44 +0800 CST 如何检查进程是否有 GUI? 772 假设有这样一个循环:for proc in psutil.process_iter(): 如何检查它是否有procGUI,是否有可能获得完全有 GUI 的程序的纯列表?PS:您只需要使用 GUI 获取正在运行的进程 python gui 1 个回答 Voted Best Answer eri 2022-08-26T20:12:56+08:002022-08-26T20:12:56+08:00 原理是一样的:我们向操作系统询问所有窗口的信息,并从窗口中获取 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() 在 Windows 上,可能仍然有一些通过 COM 的东西。
原理是一样的:我们向操作系统询问所有窗口的信息,并从窗口中获取 pid。使用 winpids 函数,您将已经获得进程列表,并且不再需要 process_iter,而是将其作为示例。
Xorg(Linux):
安装
编码:
Win32(Windows):
检查了python3.10、pywin32-304、windows 11。
安装
虽然最好通过安装程序安装pywin32 https://github.com/mhammond/pywin32/releases/
编码
在 Windows 上,可能仍然有一些通过 COM 的东西。