如何用Python获取所有带窗口的运行中GUI应用进程列表?
区分Windows GUI进程与后台进程(基于psutil)
实现思路
Windows任务管理器中的GUI进程指拥有可见顶层窗口的进程,后台进程则无关联可见窗口。要实现该分类,需结合psutil与Windows API(通过pywin32库),检查进程是否绑定了符合条件的窗口。
依赖安装
先安装所需依赖库:
pip install psutil pywin32
完整代码实现
import psutil import win32gui import win32process def is_gui_process(process): """判断进程是否为GUI进程(拥有可见顶层窗口)""" def callback(hwnd, extra): # 仅筛选可见、非最小化的顶层窗口 if win32gui.IsWindowVisible(hwnd) and not win32gui.IsIconic(hwnd): _, pid = win32process.GetWindowThreadProcessId(hwnd) if pid == process.pid: extra["has_gui"] = True return False # 找到匹配窗口后停止枚举 return True try: extra = {"has_gui": False} win32gui.EnumWindows(callback, extra) return extra["has_gui"] except (psutil.AccessDenied, psutil.NoSuchProcess): # 无权限访问或进程已结束,默认归为后台进程 return False def segregate_processes(processes): """将进程区分为GUI应用和后台进程""" gui_processes = [] background_processes = [] for process in processes: if is_gui_process(process): gui_processes.append(process) else: background_processes.append(process) return gui_processes, background_processes # 使用示例 if __name__ == "__main__": processes = psutil.process_iter(["pid", "name"]) gui_procs, bg_procs = segregate_processes(processes) print("GUI进程:") for proc in gui_procs: print(f"PID: {proc.pid}, 名称: {proc.name()}") print("\n后台进程:") for proc in bg_procs: print(f"PID: {proc.pid}, 名称: {proc.name()}")
关键说明
- 通过
win32gui.EnumWindows枚举系统所有顶层窗口,再用GetWindowThreadProcessId获取窗口所属进程PID,与当前进程PID匹配则判定为GUI进程。 - 过滤条件
IsWindowVisible和not IsIconic确保只统计可见、非最小化的窗口,和Windows任务管理器的分类逻辑对齐。 - 增加异常处理,避免因进程权限限制或进程已退出导致的运行报错。
内容的提问来源于stack exchange,提问作者Tarun Sinha
相关产品推荐
相关产品推荐

