python win32api win32gui win32con 窗口句柄 发送消息 常用方法 键盘输入

python win32api win32gui win32con 窗口句柄 发送消息 常用方法 键盘输入推荐微软的 Spy 来查看窗口类名等信息 importwin32g 从顶层窗口向下搜索主窗口 无法搜索子窗口 FindWindow lpClassName None lpWindowName None 窗口类名窗口标题名 handle win32gui FindWindow Notepad N

推荐微软的Spy++来查看窗口类名等信息。

import win32gui import win32con import win32api # 从顶层窗口向下搜索主窗口,无法搜索子窗口 # FindWindow(lpClassName=None, lpWindowName=None) 窗口类名 窗口标题名 handle = win32gui.FindWindow("Notepad", None) # 获取窗口位置 left, top, right, bottom = win32gui.GetWindowRect(handle) #获取某个句柄的类名和标题 title = win32gui.GetWindowText(handle) clsname = win32gui.GetClassName(handle) # 打印句柄 # 十进制 print(handle) # 十六进制 print("%x" %(handle) ) # 搜索子窗口 # 枚举子窗口 hwndChildList = [] win32gui.EnumChildWindows(handle, lambda hwnd, param: param.append(hwnd), hwndChildList) # FindWindowEx(hwndParent=0, hwndChildAfter=0, lpszClass=None, lpszWindow=None) 父窗口句柄 若不为0,则按照z-index的顺序从hwndChildAfter向后开始搜索子窗体,否则从第一个子窗体开始搜索。 子窗口类名 子窗口标题 subHandle = win32gui.FindWindowEx(handle, 0, "EDIT", None) # 获得窗口的菜单句柄 menuHandle = win32gui.GetMenu(subHandle) # 获得子菜单或下拉菜单句柄  # 参数:菜单句柄 子菜单索引号 subMenuHandle = win32gui.GetSubMenu(menuHandle, 0) # 获得菜单项中的的标志符,注意,分隔符是被编入索引的  # 参数:子菜单句柄 项目索引号  menuItemHandle = win32gui.GetMenuItemID(subMenuHandle, 0) # 发送消息,加入消息队列,无返回  # 参数:句柄 消息类型 WParam IParam win32gui.postMessage(subHandle, win32con.WM_COMMAND, menuItemHandle, 0) # wParam的定义是32位整型,high word就是他的31至16位,low word是它的15至0位。 # 当参数超过两个,wParam和lParam不够用时,可以将wParam就给拆成两个int16来使用。 # 这种时候在python里记得用把HIWORD的常数向左移16位,再加LOWORD,即wParam = HIWORD<<16+LOWORD。 # 下选框内容更改 # 参数:下选框句柄; 消息内容; 参数下选框的哪一个item,以0起始的待选选项的索引;如果该值为-1,将从组合框列表中删除当前选项,并使当前选项为空; 参数 # CB_Handle为下选框句柄,PCB_handle下选框父窗口句柄 if win32api.SendMessage(CB_handle, win32con.CB_SETCURSEL, 1, 0) == 1: # 下选框的父窗口命令 # 参数:父窗口句柄; 命令; 参数:WParam:高位表示类型,低位表示内容;参数IParam,下选框句柄 # CBN_SELENDOK当用户选择了有效的列表项时发送,提示父窗体处理用户的选择。 LOWORD为组合框的ID. HIWORD为CBN_SELENDOK的值。 win32api.SendMessage(PCB_handle, win32con.WM_COMMAND, 0x90000, CB_handle) # CBN_SELCHANGE当用户更改了列表项的选择时发送,不论用户是通过鼠标选择或是通过方向键选择都会发送此通知。LOWORD为组合框的ID. HIWORD为CBN_SELCHANGE的值。 win32api.SendMessage(PCB_handle, win32con.WM_COMMAND, 0x10000, CB_handle) # 设置文本框内容,等窗口处理完毕后返回true。中文需编码成gbk  # 参数:句柄;消息类型;参数WParam,无需使用; 参数IParam,要设置的内容,字符串 win32api.SendMessage(handle, win32con.WM_SETTEXT, 0, os.path.abspath(fgFilePath).encode('gbk')) # 控件点击确定,处理消息后返回0 # 参数:窗口句柄; 消息类型; 参数WParam HIWORD为0(未使用),LOWORD为控件的ID; 参数IParam 0(未使用),确定控件的句柄 win32api.SendMessage(Mhandle, win32con.WM_COMMAND, 1, confirmBTN_handle) # 获取窗口文本不含截尾空字符的长度 # 参数:窗口句柄; 消息类型; 参数WParam; 参数IParam bufSize = win32api.SendMessage(subHandle, win32con.WM_GETTEXTLENGTH, 0, 0) +1 # 利用api生成Buffer strBuf = win32gui.PyMakeBuffer(bufSize) print(strBuf) # 发送消息获取文本内容 # 参数:窗口句柄; 消息类型;文本大小; 存储位置 length = win32gui.SendMessage(subHandle, win32con.WM_GETTEXT, bufSize, strBuf) # 反向内容,转为字符串 # text = str(strBuf[:-1]) address, length = win32gui.PyGetBufferAddressAndLen(strBuf) text = win32gui.PyGetString(address, length) # print('text: ', text) # 鼠标单击事件 #鼠标定位到(30,50) win32api.SetCursorPos([30,150]) #执行左单键击,若需要双击则延时几毫秒再点击一次即可 win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP | win32con.MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0) #右键单击 win32api.mouse_event(win32con.MOUSEEVENTF_RIGHTUP | win32con.MOUSEEVENTF_RIGHTDOWN, 0, 0, 0, 0) def click1(x,y): #第一种 win32api.SetCursorPos((x,y)) win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN,x,y,0,0) win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP,x,y,0,0) def click2(x,y): #第二种 ctypes.windll.user32.SetCursorPos(x,y) ctypes.windll.user32.mouse_event(2,0,0,0,0) ctypes.windll.user32.mouse_event(4,0,0,0,0) def click_it(pos): #第三种 handle= win32gui.WindowFromPoint(pos) client_pos =win32gui.ScreenToClient(handle,pos) tmp=win32api.MAKELONG(client_pos[0],client_pos[1]) win32gui.SendMessage(handle, win32con.WM_ACTIVATE,win32con.WA_ACTIVE,0) win32gui.SendMessage(handle, win32con.WM_LBUTTONDOWN,win32con.MK_LBUTTON,tmp) win32gui.SendMessage(handle, win32con.WM_LBUTTONUP,win32con.MK_LBUTTON,tmp) # 发送回车 win32api.keybd_event(13,0,0,0) win32api.keybd_event(13,0,win32con.KEYEVENTF_KEYUP,0) # 关闭窗口 win32gui.PostMessage(win32lib.findWindow(classname, titlename), win32con.WM_CLOSE, 0, 0) # 检查窗口是否最小化,如果是最大化 if(win32gui.IsIconic(hwnd)): # win32gui.ShowWindow(hwnd, win32con.SW_SHOWNORMAL) win32gui.ShowWindow(hwnd, 8) sleep(0.5) # SW_HIDE:隐藏窗口并激活其他窗口。nCmdShow=0。 # SW_MAXIMIZE:最大化指定的窗口。nCmdShow=3。 # SW_MINIMIZE:最小化指定的窗口并且激活在Z序中的下一个顶层窗口。nCmdShow=6。 # SW_RESTORE:激活并显示窗口。如果窗口最小化或最大化,则系统将窗口恢复到原来的尺寸和位置。在恢复最小化窗口时,应用程序应该指定这个标志。nCmdShow=9。 # SW_SHOW:在窗口原来的位置以原来的尺寸激活和显示窗口。nCmdShow=5。 # SW_SHOWDEFAULT:依据在STARTUPINFO结构中指定的SW_FLAG标志设定显示状态,STARTUPINFO 结构是由启动应用程序的程序传递给CreateProcess函数的。nCmdShow=10。 # SW_SHOWMAXIMIZED:激活窗口并将其最大化。nCmdShow=3。 # SW_SHOWMINIMIZED:激活窗口并将其最小化。nCmdShow=2。 # SW_SHOWMINNOACTIVE:窗口最小化,激活窗口仍然维持激活状态。nCmdShow=7。 # SW_SHOWNA:以窗口原来的状态显示窗口。激活窗口仍然维持激活状态。nCmdShow=8。 # SW_SHOWNOACTIVATE:以窗口最近一次的大小和状态显示窗口。激活窗口仍然维持激活状态。nCmdShow=4。 # SW_SHOWNORMAL:激活并显示一个窗口。如果窗口被最小化或最大化,系统将其恢复到原来的尺寸和大小。应用程序在第一次显示窗口的时候应该指定此标志。nCmdShow=1。 
# win32虽然也可控制键盘,但不如使用PyUserInput的方便。需要注意在windows和mac下接口参数可能有所不同。 from pymouse import PyMouse from pykeyboard import PyKeyboard m = PyMouse() k = PyKeyboard() x_dim, y_dim = m.screen_size() # 鼠标点击 m.click(x_dim/2, y_dim/2, 1) # 键盘输入 k.type_string('Hello, World!') # 按住一个键 k.press_key('H') # 松开一个键 k.release_key('H') # 按住并松开,tap一个键 k.tap_key('e') # tap支持重复的间歇点击键 k.tap_key('l',n=2,interval=5) # 发送判断文字 k.type_string('') #创建组合键 k.press_key(k.alt_key) k.tap_key(k.tab_key) k.release_key(k.alt_key) # 特殊功能键 k.tap_key(k.function_keys[5]) # Tap F5 k.tap_key(k.numpad_keys['Home']) # Tap 'Home' on the numpad k.tap_key(k.numpad_keys[5], n=3) # Tap 5 on the numpad, thrice # Mac系统 k.press_keys(['Command','shift','3']) # Windows系统 k.press_keys([k.windows_l_key,'d']) 其中的PyMouseEvent和PyKeyboardEvent还可用于监听鼠标和键盘事件的输入
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/213744.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月18日 下午5:45
下一篇 2026年3月18日 下午5:45


相关推荐

  • 排名前十的时序数据库[通俗易懂]

    排名前十的时序数据库[通俗易懂]时序数据库全称为时间序列数据库。时间序列数据库主要用于指处理带时间标签(按照时间的顺序变化,即时间序列化)的数据,带时间标签的数据也称为时间序列数据。时序数据的兴起还是榜上了物联网的大风。物联网(InternetofThings,简称IOT)是指通过各种信息传感器实时采集任何需要管理设备的信息,并进行管理。物联网的基础数据具有数据量大、结构单一、时间属性强、查询简单等特点,传统的关系型数据库在面对物联网数据时,显得应对发力,基本上属于功能过剩但性能不足。目前最新的DB-Engine上时序数据库排名如下

    2022年10月4日
    4
  • python正则表达式入门

    python正则表达式入门今天我们来学习 python 的正则表达式的部分 先说下为什么要学习这一部分呢 当然是因为正则表达式处理文本类型的数据实在是太方便了 为以后进入 nlp 领域打打基础 先给大家推荐一个网站 用于正则表达式验证 大致就长这个样子 这里写目录标题 1 基础知识 2 贪婪模式和非贪婪模式 3 反斜杠的用途 4 中括号的用法 5 匹配启始和结束位置 6 括号的用法 组选择 7 正则表达式切割字符总结 1 基础知识普通字符 普通字符的含义就是字节匹配他们 特殊字符 它们出现在正则表达式中 不是直接匹配他们 而是

    2026年3月19日
    2
  • @JsonIgnore作用「建议收藏」

    @jsonignore的作用作用是json序列化时将javabean中的一些属性忽略掉,序列化和反序列化都受影响。如下:packagecom.hzboy.orm;importjava.util.List;importjavax.persistence.CascadeType;importjavax.persistence.Column;importj

    2022年4月11日
    121
  • arcgis入门到精通视频教程下载连接[通俗易懂]

    arcgis入门到精通视频教程下载连接[通俗易懂]04空间数据Coverage的创建.wmv05空间数据Geodatabase数据库创建.wmv06空间可视化工具ArcMap.wmv07空间数据编辑.avi08空间数据的转换.wmv09空间数据的处理.wmv10空与制图间数据的可视化.wmv11空间分析工具.wmv12ArcGIS矢量数据的空间分析.wmv13Arcgis栅格数据的空间分析.wmv14-1ArcGIS三维分析.

    2022年6月15日
    35
  • java中的inherits_node.js 下使用 util.inherits 来实现继承

    java中的inherits_node.js 下使用 util.inherits 来实现继承上一篇博客说到了 node js 继承 events 类实现事件发射和事件绑定函数 其中我们实现了一个公用基类 base 然后在模型中差异化的定义了各种业务需要的模型并继承 base 公共基类 但是其中的继承是一笔带过 今天详细的说下 node js 中继承 varevents require events varutil require util function base th

    2026年3月16日
    2
  • Ps怎么更换照片背景?PS换照片背景教程详细步骤

    Ps怎么更换照片背景?PS换照片背景教程详细步骤

    2026年3月14日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号