如何利用Python和win32编程避免重复性体力劳动(二)——菜单操作:GetMenu,GetSubMenu,GetMenuItemID以及wParam的HIWORD&LOWORD
来源:互联网 发布:阿里通网络短信 编辑:程序博客网 时间:2024/06/06 09:58
Part 2:菜单操作
有了句柄,我们就可以操作FaceGen了!嗯,要先打开文件,File→Open,然后再File→Save Image(很悲剧,Save Image没有快捷键,所以不得不进行菜单操作)。现在我们有了FindWindow和FindWindowEx,要怎么操作菜单呢?
哦,抱歉,靠他俩还做不到。
窗口的菜单就像窗口的标题栏一样,是窗口自身的一部分,不是其他窗体控件,也就没有办法用FindWindow和FindWindowEx返回句柄。所以要对菜单进行操作的话,我们需要新的函数,也就是GetMenu,GetSubMenu和GetMenuItemID,它们也都属于win32gui模块。怎么用呢,结合下图来说:
- GetMenu(hwnd)
- 描述:获取窗口的菜单句柄。
- 参数:
- hwnd:整型,需要获取菜单的窗口的句柄。
- 说明:获取的是插图中黄色的部分。
- GetSubMenu(hMenu, nPos)
- 描述:获取菜单的下拉菜单或者子菜单。
- 参数:
- hMenu:整型,菜单的句柄,从GetMenu获得。
- nPos:整型,下拉菜单或子菜单的的索引,从0算起。
- 说明:这个可以获取插图中蓝色的部分z;如描述所述,这个不仅可以获取本例中的下拉菜单,还可以获取子菜单。
- GetMenuItemID(hMenu, nPos)
- 描述:获取菜单中特定项目的标识符。
- 参数:
- hMenu:整型,包含所需菜单项的菜单句柄,从GetSubMenu获得。
- nPos:整型,菜单项的索引,从0算起。
- 说明:这个获取的就是红色区域中的项目啦,注意,分隔符是被编入索引的,所以Open的索引是2而非1,而Exit的索引是9而非6。
找到这个菜单项的标识符有什么用呢?找到以后我们就可以告诉应用程序:我们要执行这个菜单项的命令!怎么告诉呢?这就要涉及消息机制了,我们要给应用程序发个消息,让它执行所需菜单项的命令。假设之前获取的Open的标识符是open_ID,那么只需要这样:
就会有一个打开文件的对话框出现啦。
解释一下:
- PostMessage(hWnd, Msg, wParam, lParam)
- 描述:在消息队列中加入为指定的窗体加入一条消息,并马上返回,不等待线程对消息的处理。
- 参数:
- hWnd:整型,接收消息的窗体句柄
- Msg:整型,要发送的消息,这些消息都是windows预先定义好的,可以参见系统定义消息(System-Defined Messages))
- wParam:整型,消息的wParam参数
- lParam:整型,消息的lParam参数
- 说明:简单说,就是给指定程序发一个消息,这些消息都用整型编好号,作为windows的常量可以查询的。在这里,我们用的就是win32con这个库里定义的WM_COMMAND这个消息,具体的wParam和lParam是根据消息的不同而不同的。具体请根据MSDN查阅。
关于wParam的low word和high word:
查阅MSDN的消息时,会发现有的wParam定义了low word和high word,这是什么呢?wParam的定义是32位整型,high word就是他的31至16位,low word是它的15至0位,如图。当参数超过两个,wParam和lParam不够用时,可以将wParam就给拆成两个int16来使用。这种时候在python里记得用把HIWORD的常数向左移16位,再加LOWORD,即wParam = HIWORD<<16+LOWORD。
更新一下我们定义的类,把菜单添加进去:
在这里顺便返回了弹出来的对话框的句柄和确定按钮的句柄,后面操作会用到。
- 如何利用Python和win32编程避免重复性体力劳动(二)——菜单操作:GetMenu,GetSubMenu,GetMenuItemID以及wParam的HIWORD&LOWORD
- 如何利用Python和win32编程避免重复性体力劳动(二)——菜单操作:GetMenu,GetSubMenu,GetMenuItemID以及wParam的HIWORD&LOWORD
- 如何利用Python和win32编程避免重复性体力劳动(三)——文本框操作:WM_GETTEXT 和WM_SETTEXT
- 如何利用Python和win32编程避免重复性体力劳动(四)——下拉列表操作:CB_SETCURSEL、CBN_SELENDOK和CBN_SELCHANGE
- 如何利用Python和win32编程避免重复性体力劳动(三)——文本框操作:WM_GETTEXT 和WM_SETTEXT
- 如何利用Python和win32编程避免重复性体力劳动(四)——下拉列表操作:CB_SETCURSEL、CBN_SELENDOK和CBN_SELCHANGE
- 如何利用Python和win32编程避免重复性体力劳动(一)——开始、FindWindow和FindWindowEx
- 如何利用Python和win32编程避免重复性体力劳动(一)——开始、FindWindow和FindWindowEx
- HIWORD和LOWORD
- 位移操作LOWORD HIWORD LOBYTE HIBYTE
- 对LOWORD, HIWORD, LOBYTE, HIBYTE的理解
- 对LOWORD, HIWORD, LOBYTE, HIBYTE的理解
- 对LOWORD, HIWORD, LOBYTE, HIBYTE的理解
- 对LOWORD, HIWORD, LOBYTE, HIBYTE的理解
- Visual Studio 2010中GetMenu()和GetSubMenu(0)引发异常的一个简单解决方法
- VS2010中GetMenu()和GetSubMenu(0)为NULL引发异常的解决方法
- VS2010中GetMenu()和GetSubMenu(0)为NULL引发异常的解决方法
- VS2010中GetMenu()和GetSubMenu(0)为NULL引发异常的解决方法
- springmvc的路径传参!
- jQuery自定义插件
- AndroidStudio中如何切换包名
- RAID详解[RAID0/RAID1/RAID10/RAID5]
- webstorm注册码
- 如何利用Python和win32编程避免重复性体力劳动(二)——菜单操作:GetMenu,GetSubMenu,GetMenuItemID以及wParam的HIWORD&LOWORD
- thymeleavf使用
- HYSBZ-3224:Tyvj 1728 普通平衡树(splay结构体,无插入求前驱后继)
- css-8.ul 列表
- JavaScript面对对象编程
- NVMe SSD终于也有了这个“数据安全防护衣”!
- 容器索引
- Linux下安装tomcat
- TCP三次握手与四次挥手——上篇