Python如何获取Windows应用DASTraderPro子窗口文本并高频刷新
从DASTraderPro子窗口高频提取文本的Python实现方案
前置依赖安装
执行命令安装Windows API调用库:pip install pywin32
核心逻辑
绕过速度过慢的OCR方案,直接调用Windows原生API遍历目标应用的子窗口,通过SendMessage发送系统消息获取控件文本,单轮提取耗时通常在10ms以内,完全可以满足0.5秒级的刷新要求。
具体实现代码
import win32gui import win32con import time # 替换为DASTraderPro主窗口的实际标题,可在任务管理器的应用详情里查看,或用Spy++工具获取 MAIN_WINDOW_TITLE = "DASTraderPro" # 可选:提前用Spy++查到目标文本所在子窗口的控件ID,可跳过遍历逻辑,直接提取,速度更快 TARGET_CTRL_ID = None # 示例值:1001,替换为实际ID后生效 child_hwnd_list = [] # 子窗口枚举回调函数,会自动遍历主窗口下所有层级的子窗口 def enum_child_callback(hwnd, extra): child_hwnd_list.append(hwnd) return True # 读取指定窗口的文本内容,比GetWindowText兼容性更强,支持跨进程读取子窗口文本 def get_hwnd_text(hwnd): text_length = win32gui.SendMessage(hwnd, win32con.WM_GETTEXTLENGTH, 0, 0) if text_length == 0: return "" # 申请对应长度的缓冲区存储文本 buffer = win32gui.PyMakeBuffer(text_length + 1) win32gui.SendMessage(hwnd, win32con.WM_GETTEXT, text_length + 1, buffer) # 中文系统默认用gbk编码,乱码可尝试替换为utf-8 return buffer.tobytes().decode("gbk", errors="ignore").strip() def extract_das_text(): child_hwnd_list.clear() # 查找DASTraderPro主窗口句柄 main_hwnd = win32gui.FindWindow(None, MAIN_WINDOW_TITLE) if not main_hwnd: return {} # 遍历所有子窗口 win32gui.EnumChildWindows(main_hwnd, enum_child_callback, None) result = {} for hwnd in child_hwnd_list: ctrl_id = win32gui.GetWindowLong(hwnd, win32con.GWL_ID) # 如果指定了目标控件ID,直接返回对应文本 if TARGET_CTRL_ID and ctrl_id == TARGET_CTRL_ID: return {ctrl_id: get_hwnd_text(hwnd)} text = get_hwnd_text(hwnd) if text: result[ctrl_id] = text return result if __name__ == "__main__": # 循环提取,间隔0.5秒 while True: das_data = extract_das_text() # 这里替换为你自己的处理逻辑,比如存库、打印等 print(das_data) time.sleep(0.5)
常见问题处理
- 如果提取结果为空,优先用Spy++工具查看DASTraderPro的控件类型:如果是自绘控件、Qt/QML、WPF控件,无法通过SendMessage拿到文本,可改用高速OCR方案:用
mss库做毫秒级截图,搭配基于ONNX Runtime的轻量OCR模型,单轮识别耗时可控制在100ms以内,也能满足刷新要求。 - 提前查到目标子窗口的控件ID后,填写到
TARGET_CTRL_ID变量,可跳过全量子窗口遍历,进一步提升提取速度。 - 窗口标题如果有动态后缀,可以用
win32gui.EnumWindows遍历所有窗口模糊匹配标题,不用精确匹配。
内容的提问来源于stack exchange,提问作者GIkon
相关产品推荐
相关产品推荐

