如何获取指定应用程序内的已打开窗口列表
获取指定应用的所有窗口(含子窗口)解决方案
核心思路
要获取指定应用内的所有窗口(包括顶级窗口的子窗口),需要两步:
- 定位目标应用的顶级窗口句柄
- 递归枚举该顶级窗口下的所有子窗口
具体实现代码
先确保安装所需依赖:
pip install pywin32 psutil
完整代码示例(以记事本为例):
import win32gui import win32process import psutil def get_target_top_hwnds(process_name): """根据进程名获取目标应用的所有顶级窗口句柄""" target_pids = [proc.pid for proc in psutil.process_iter(['name']) if proc.name() == process_name] top_hwnds = [] def enum_top_windows(hwnd, ctx): if win32gui.IsWindowVisible(hwnd): _, pid = win32process.GetWindowThreadProcessId(hwnd) if pid in target_pids: ctx.append(hwnd) win32gui.EnumWindows(enum_top_windows, top_hwnds) return top_hwnds def enum_child_windows(hwnd, window_list): """递归枚举指定窗口的所有子窗口(含自身)""" if win32gui.IsWindowVisible(hwnd): window_title = win32gui.GetWindowText(hwnd) # 可根据需求调整:是否保留无标题的窗口 if window_title or True: window_list.append((hwnd, window_title)) # 递归枚举子窗口 win32gui.EnumChildWindows(hwnd, enum_child_windows, window_list) # 示例:获取记事本的所有窗口 if __name__ == "__main__": target_process = "notepad.exe" top_hwnds = get_target_top_hwnds(target_process) all_windows = [] for hwnd in top_hwnds: enum_child_windows(hwnd, all_windows) # 输出结果 print(f"应用 {target_process} 的所有窗口:") for hwnd, title in all_windows: print(f"句柄: {hwnd}, 标题: {title or '(无标题)'}")
代码说明
get_target_top_hwnds:通过进程名匹配对应的PID,再遍历所有顶级窗口,筛选出属于目标进程的窗口句柄。如果不需要通过进程名,也可以直接在EnumWindows回调里匹配窗口标题。enum_child_windows:递归调用win32gui.EnumChildWindows,遍历指定窗口下的所有层级子窗口,同时收集窗口句柄和标题。可根据实际需求修改判断条件(比如过滤无标题窗口)。
注意事项
- 部分应用的子窗口可能无可见标题,或句柄会动态变化,需根据场景调整筛选逻辑。
- 确保有足够权限枚举系统窗口,部分受保护进程可能无法获取其窗口信息。
内容的提问来源于stack exchange,提问作者rogal
相关产品推荐
相关产品推荐

