如何用Python psutil获取电脑前台应用(非进程)列表?
如何列出Windows前台可见应用(对应任务管理器「APPS」分类)
你用psutil只能遍历所有进程,没法区分任务管理器里「APPS」分类的前台可见应用——这类应用都是带有可见窗口的GUI程序,而psutil本身没有窗口相关的判断能力。要实现需求,得结合Windows的窗口API来筛选,下面是具体的实现方案:
实现步骤
- 先安装依赖库
pywin32,它能调用Windows系统API获取窗口信息:
pip install pywin32
- 使用以下代码筛选可见的前台应用:
import win32gui import win32process import psutil def get_visible_apps(): visible_apps = [] # 遍历所有顶层窗口的回调函数 def enum_windows_callback(hwnd, extra): # 只保留可见且有窗口标题的窗口 if win32gui.IsWindowVisible(hwnd): window_title = win32gui.GetWindowText(hwnd) if window_title: # 获取窗口对应的进程ID _, pid = win32process.GetWindowThreadProcessId(hwnd) try: process = psutil.Process(pid) # 过滤掉系统后台进程(可根据需求调整名单) system_processes = ["svchost.exe", "csrss.exe", "wininit.exe", "services.exe"] if process.name() not in system_processes: visible_apps.append({ "窗口标题": window_title, "进程名": process.name(), "PID": pid }) except (psutil.NoSuchProcess, psutil.AccessDenied): # 忽略无法访问的进程 pass return True win32gui.EnumWindows(enum_windows_callback, None) # 去重:同一进程可能有多个窗口,只保留一条记录 unique_apps = {} for app in visible_apps: key = (app["进程名"], app["PID"]) if key not in unique_apps: unique_apps[key] = app return list(unique_apps.values()) # 打印结果 for app in get_visible_apps(): print(f"窗口标题: {app['窗口标题']}, 进程名: {app['进程名']}, PID: {app['PID']}")
代码说明
win32gui.EnumWindows:遍历系统中所有顶层窗口IsWindowVisible:判断窗口是否处于可见状态GetWindowText:获取窗口标题,排除无标题的系统窗口(比如任务栏、桌面底层窗口)GetWindowThreadProcessId:把窗口和对应的进程ID关联起来- 最后通过psutil获取进程信息,并过滤掉常见的后台系统进程,同时做去重处理
你可以根据自己的需求调整system_processes列表,比如要不要保留explorer.exe(桌面资源管理器),或者添加其他需要排除的进程。
内容的提问来源于stack exchange,提问作者Cyber Bandit
相关产品推荐
相关产品推荐

