为什么CreateProcess返回的PyHANDLE调用GetWindowText时无效?
问题原因
- 句柄类型不匹配
win32process.CreateProcess返回的元组四个元素依次为进程句柄、主线程句柄、进程ID、主线程ID,你传入win32gui.GetWindowText的第一个返回值是进程句柄,属于进程对象的标识;而win32gui下所有窗口操作类函数要求传入的是窗口句柄(HWND),二者是Windows系统中完全不同的内核对象类型,混用自然无法得到正确结果。 - 启动参数禁止了窗口创建
你调用CreateProcess时传入了win32process.CREATE_NO_WINDOW标志,该参数的作用就是强制新进程不创建任何GUI窗口,即使目标程序默认带界面,加这个参数后也不会生成窗口句柄,不可能获取到窗口文本。
功能实现方案
如果需要获取目标进程的窗口标题,需要调整启动参数,再通过进程ID匹配找到对应窗口句柄,示例代码如下:
import win32process import win32gui import time # 启动进程,移除CREATE_NO_WINDOW参数 process_info = win32process.CreateProcess( 'LabMax.exe', '', None, None, 0, 0, # 无特殊启动标志,允许创建窗口 None, None, win32process.STARTUPINFO() ) target_pid = process_info[2] # 等待进程完成初始化,可根据程序启动速度调整等待时长 time.sleep(2) target_hwnd = None # 枚举系统所有顶层窗口,匹配对应进程的可见窗口 def enum_windows_callback(hwnd, _): global target_hwnd _, window_pid = win32process.GetWindowThreadProcessId(hwnd) if window_pid == target_pid and win32gui.IsWindowVisible(hwnd): target_hwnd = hwnd return False return True win32gui.EnumWindows(enum_windows_callback, None) if target_hwnd: title = win32gui.GetWindowText(target_hwnd) print('Title:', title) else: print('未找到对应进程的可见窗口')
内容的提问来源于stack exchange,提问作者charlin chen
相关产品推荐
相关产品推荐

