一、概念
句柄指的是操作系统为了标识和访问对象而提供的一个标识符,在操作系统中,每个对象都有一个唯一的句柄,通过句柄可以访问对象的属性和方法。例如文件、进程、窗口等都有句柄。在编程中,可以通过句柄来操作这些对象,从而实现对系统资源的控制和管理。
二、实战
1、获取当前所有窗口的句柄
def get_all_window():hwnd_list = []win32gui.EnumWindows(lambda hwnd, param: param.append(hwnd), hwnd_list)return hwnd_list
2、从所有窗口句柄中,根据窗口标题title,获取想要的特定窗口句柄
def get_hwnd_from_name(name)hwnd_list = []all_hwnd_list = get_all_window() # 调用上面的方法for hwnd in all_hwnd_list:title = win32gui.GetWindowText(hwnd) # 根据窗口句柄,获取句柄对应的窗口的标题if title == name:hwnd_list.append(hwnd)logging.info(f'窗口标题为{name}的所有窗口的句柄:{hwnd_list}')return hwnd_list
3、根据窗口句柄,获取一些别的信息(适用于窗口句柄不唯一,但是标题、类名等值唯一的情况)
def get_windows_info(hwnd):all_hwnd_list = get_all_window() # 调用上面的方法for hwnd in all_hwnd_list:# 获取窗口标题title = win32gui.GetWindowText(hwnd)# 获取窗口类名clsname = win32gui.GetClassName(hwnd)# 获取窗口位置和大小rect= win32gui.GetWindowRect(hwnd)# 获取窗口所在的进程ID和线程IDpid, tid = win32process.GetWindowThreadProcessId(hwnd)# 返回窗口的属性信息return {'title': title, 'class': clsname, 'rect': rect, 'pid': pid, 'tid': tid}
4、获取主窗口句柄,根据其子窗口的标题获取该子窗口对象,然后点击子窗口
def blurred_click_button_in_window(title='XX', Buttons='状态'):handle = get_hwnd_from_name(title) # 调用上面的方法# handle = handle[0] # 如果列表有多个值,则需要确认你想要的窗口句柄是哪一个print(f'获取到的窗口句柄是:{handle}')time.sleep(1)app = Application(backend='uia').connect(handle=handle) # 连接到此窗口try:win32gui.SetForegroundWindow(handle) # 将窗口置顶,避免被遮挡except Exception as e:logging.info(f'{e}')main_window = app.window(handle=handle) # 获取主窗口对象main_window.print_control_identifiers() # 打印出此主窗口包含的所有子窗口的信息(title,auto_id,control_type)child_window = main_window.child_window(title_re=Buttons, found_index=0) #根据子窗口的标题获取子窗口对象(_re表示模糊匹配,found_index=0适用于title不唯一时取索引为第一位的),也可根据类名来获取:child_window = main_window.child_window(class_name='Edit')child_window.click_input() # 点击子窗口,如果是输入框赋值可以写成:child_window.type_keys('Cc')return main_window