本博客正逐步迁移至OrangeCube四次元

请移步至这里以获得更加的排版和阅读体验,谢谢您

Part 3:控件操作A

通过菜单的目录操作,我们打开了打开文件对话框。为了简单起见,我们可以直接在文件名处填入要打开文件的绝对路径。怎么填呢?

首先还是定位到文本框控件

handle = find_subHandle(Mhandle, [("ComboBoxEx32", 0), ("ComboBox", 0), ("Edit", 0)])

find_subHandle()是在Part 1中定义的函数,可以按照列表的信息查找Mhandle的子窗体。列表中的元组提供窗体的类名和排位号(z-index)。列表索引编号较小的为父窗体。

接着我们依然是利用win32的消息机制,给这个文本框控件送去一个消息:

win32api.SendMessage(handle, win32con.WM_SETTEXT, 0, os.path.abspath(fgFilePath).encode('gbk'))

在这里,我们用了SendMessage而不是PostMessage,其区别就在于我们可以通过SendMessage取得消息的返回信息。因为对于我们要设置文本框信息的WM_SETTEXT信息来说,设置成功将返回True。

  • SendMessage(hWnd, Msg, wParam, lParam)

    • 描述:在消息队列中加入为指定的窗体加入一条消息,直到窗体处理完信息才返回。
    • 参数:
      • hWnd:整型,接收消息的窗体句柄
      • Msg:整型,要发送的消息,这些消息都是windows预先定义好的,可以参见系统定义消息(System-Defined Messages).aspx#system_defined)
      • wParam:整型,消息的wParam参数
      • lParam:整型,消息的lParam参数
    • 说明:wParam和IParam根据具体的消息不同而有不同的定义,详情参阅Part 2.
  • WM_SETTEXT 消息

    • 描述:设置窗体的文本
    • 参数:
      • wParam:未使用
      • lParam:一个指针,指向以null结尾的字符串。窗体文本将被设置为该字符串。
    • 返回值:
      • 如果成功设置,则返回1(MSDN原文是返回True)
    • 说明:
      • 上面的定义是直接从MSDN上翻译过来的,在Python的语境里面没有指针,你只需要把变量名作为lParam传入就好了。
      • 另外,请注意编码,包含中文请用gbk编码,否则乱码

再利用一个WM_COMMAND消息来点击确定按钮:

win32api.SendMessage(Mhandle, win32con.WM_COMMAND, 1, confirmBTN_handle)
  • WM_COMMAND 消息

    • 描述:当用户选择了菜单(或按钮等控件的)命令,或控件发送通知到父窗口,或加速键击(accelerator keystroke is translated)时发送。
    • 参数:根据情景不同而不同,在这里属于用户命令,参数配置如下
      • wParam:HIWORD为0(未使用),LOWORD为控件的ID
      • lParam:0(未使用)
    • 返回值:如果窗体处理了消息,应返回0

综上,我们现在就可以利用win32的各种API完成打开fg文件的任务了。

def open_fg(self, fgFilePath):"""打开fg文件"""Mhandle, confirmBTN_handle = self.menu_command('open')handle = find_subHandle(Mhandle, [("ComboBoxEx32", 0), ("ComboBox", 0), ("Edit", 0)])if win32api.SendMessage(handle, win32con.WM_SETTEXT, 0, os.path.abspath(fgFilePath).encode('gbk')) == 1:return win32api.SendMessage(Mhandle, win32con.WM_COMMAND, 1, confirmBTN_handle)raise Exception("File opening path set failed")

顺便,如果要获取目标文本框的内容呢,可以使用WM_GETTEXT,如下:

  • WM_GETTEXT 消息:

    • 描述:将窗体的文本内容复制到指定的buffer对象中
    • 参数:
      • wParam:要复制字符的最大长度,包括截尾的空字节
      • lParam:用来保存字符串的buffer的指针
    • 返回值:返回复制字符的数量,不包括截尾的空字节

利用win32gui.PyMakeBuffer(len, addr)可以造一个buffer对象,类似python3中的bytearray,lParam的返回值。而利用WM_GETTEXTLENGTH可以获取不含截尾空字节的文本长度的长度,可以用来设置Buffer的长度。完整的示例如下:

buf_size = win32gui.SendMessage(hwnd, win32con.WM_GETTEXTLENGTH, 0, 0) + 1  # 要加上截尾的字节
str_buffer = win32gui.PyMakeBuffer(buf_size)  # 生成buffer对象
win32api.SendMessage(hwnd, win32con.WM_GETTEXT, buf_size, str_buffer)  # 获取buffer
str = str(str_buffer[:-1])  # 转为字符串

如何利用Python和win32编程避免重复性体力劳动(三)——文本框操作:WM_GETTEXT 和WM_SETTEXT相关推荐

  1. python pywin32 相同句柄_如何利用Python和win32编程避免重复性体力劳动(一)——开始、FindWindow和FindWindowEx...

    请移步至这里以获得更加的排版和阅读体验,谢谢您 本系列文章假设各位看官对python是足够熟悉的,但却不太了解win32编程. 嘛..其实我也没学过win32编程,脸请各位看官随意招呼. 需求:最近因 ...

  2. 如何利用Python和win32编程避免重复性体力劳动(一)——开始、FindWindow和FindWindowEx

    本博客正逐步迁移至OrangeCube四次元 请移步至这里以获得更加的排版和阅读体验,谢谢您 本系列文章假设各位看官对Python是足够熟悉的,但却不太了解win32编程. 嘛..其实我也没学过win ...

  3. 如何利用Python和win32编程避免重复性体力劳动(二)——菜单操作:GetMenu,GetSubMenu,GetMenuItemID以及wParam的HIWORDLOWORD

    本博客正逐步迁移至OrangeCube四次元 请移步至这里以获得更加的排版和阅读体验,谢谢您 Part 2:菜单操作 有了句柄,我们就可以操作FaceGen了!嗯,要先打开文件,File→Open,然 ...

  4. 利用Python和win32编程范例——按需定制一个按键精灵

    转自:作者 橘子一方 http://www.orangecube.net/articles/python-win32-example.html 利用Python和win32编程范例--按需定制一个按键 ...

  5. python 表格格式输出_利用python对excel中一列的时间数据更改格式操作

    问题场景:需要将下列的交期一列的数据格式更改成2019/05/10 存货编码 尺寸 数量 交期 0 K10Y0190000X B140 200 2019-05-10 00:00:00 1 K10Y01 ...

  6. python 需要在什么环境下运行_进入Python 环境进行编程并运行程序的三种方式

    越来越多人开始学习Python了,本篇介绍进入Python 环境进行编程并运行程序的三种方式,适合刚入门的小白参考.进入Python的前提是先下载安装Python软件,如下所示,建议下载最新版,安装过 ...

  7. python字典在编程中的作用_python中的字典操作及字典函数

    字典 dict_fruit = {'apple':'苹果','banana':'香蕉','cherry':'樱桃','avocado':'牛油果','watermelon':'西瓜'} 字典的操作 # ...

  8. python更改整列小时分钟_利用python对excel中一列的时间数据更改格式操作

    问题场景:需要将下列的交期一列的数据格式更改成2019/05/10存货编码 尺寸 数量 交期 0 K10Y0190000X B140 200 2019-05-10 00:00:00 1 K10Y019 ...

  9. Python基础----Socket编程规范及底层原理(三)---socketserver实现并发及底层原理

    Socket网络编程: 前面实现的TCP服务端只能接受一个用户接入,这里使用了并发来实现多用户接入,不废话直接上代码!原理后面慢慢给大家讲! import socketserverclass MySe ...

最新文章

  1. HDR:为用户打造的视觉盛宴
  2. 散列表(哈希表)工作原理 (转)
  3. idea zookeeper的使用_学习ZooKeeper源码,就从这篇开始吧
  4. 一招让你拿下seata分布式事务框架,看这篇文章准没错!
  5. thymeleaf 获取yml中的值_Thymeleaf前后端传值 页面取值与js取值
  6. 马斯克又又又套现了:120亿美元到手
  7. 安装node.js、webpack、vue 和vue-cli 以及安装速度慢/不成功的解决方法
  8. php多条件检索怎么写,sql查询同时满足三个条件 php查询数据库,同时满足三个条件的sql怎么写?...
  9. mysql快速部署主从复制
  10. helvetica字体未嵌入问题
  11. plantuml如何导出大图片
  12. Coin3d用vs2010编译
  13. python 区块链_python与区块链
  14. 蓝桥杯_Fibonacci数列(Java)
  15. pyserial串口通信之红外线测距模块
  16. JDK下载、安装与配置
  17. 1.10全角色FCR,FBR,FHR表
  18. 申城「三日谈」:言汇百家,思通以达(SDCC 2017上海站PPT集锦)
  19. python Flask之JinJa2
  20. EEPROM CAT24CXX实现分页读、写数据

热门文章

  1. 我的大学,我的CSDN
  2. 程序员升职加薪靠的是优势,教你发现优势运用优势
  3. php三年级英语,三年级英语拼词大赛
  4. 安装apk解析包时出现错误(应用内更新)
  5. gis data editor.php,我们的漏洞Webug 3.0中级进阶攻略(上)
  6. 实锤!Grin系中国媒体炒作,“硬核”都经不起推敲
  7. samba服务之samba-swat后台管理
  8. 系统测试报告编写规范
  9. 连锁不平衡以及连锁不平衡衰减
  10. axure文件如何加密_最全产品设计工具整理,你都掌握了吗?