You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取指定应用程序内的已打开窗口列表

获取指定应用的所有窗口(含子窗口)解决方案

核心思路

要获取指定应用内的所有窗口(包括顶级窗口的子窗口),需要两步:

  1. 定位目标应用的顶级窗口句柄
  2. 递归枚举该顶级窗口下的所有子窗口

具体实现代码

先确保安装所需依赖:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 18:13:28