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

本系列文章假设各位看官对python是足够熟悉的,但却不太了解win32编程。

嘛。。其实我也没学过win32编程,脸请各位看官随意招呼。

需求:最近因为做课题,要把800个FaceGen软件生成的三维面孔保存成图片,以后不排除每一张面孔还要生成某个特质上连续变化的图片。FaceGen以抽取面孔的特征向量来构建面孔,所以保存的文件相当精简,只需要300字节就能无损保存面孔的全部信息。一般的三维工具包是没有办法解析FaceGen软件的fg格式的,而他们自己的SDK又死贵死贵的,3K刀貌似。。嘛,自己动手,丰衣足食。

分析:要做的事情其实很简单,fg文件已经都准备好,我只需要用FaceGen打开它的fg文件,然后直接Save to Image就好了。鉴于一系列原因,不是很想用按键精灵之类的东西。何况利用pywin32可以很方便的利用win32的一些接口,何必再去模拟操作。

Part 0: 开始之前?

首先,来这里安装一个Pywin32吧,Pywin32是一个Python库,为python提供访问Windows API的扩展,提供了齐全的windows常量、接口、线程以及COM机制等等。安装后自带一个pythonwin的IDE。或者也可以来这边下载一个ActivePython,整合了pywin32和一些其他的库以及一大堆的支持文档,他们的文档查起来是非常方便的。当然了,WIN32的一些相关函数在MSDN上也能直接找到。

其次,为了方面查找目标窗口的句柄,可以下载一个微软自家的Spy++,这玩意儿满大街都是。有了它,还能很方便的查看窗体的消息。

句柄是一个32位整数,在windows中标记对象用,类似一个dict中的key,详情参看这篇文章。

消息是windows应用的重要部分,用来告诉窗体“发生了什么”,比如给一个按钮发送BN_CLICKED这么个消息,按钮就知道“哦,我被点了”,才能执行相应的下一步操作。本文将大量使用消息机制。详情参看这篇文章。

Part 1: 查找窗体句柄

貌似在win32编程的世界里,包括窗口到文本框的所有控件就是窗体,所有的窗体都有独立的句柄。要操作任意一个窗体,你都需要找到这个窗体的句柄,这里,我们就可以用到FindWindow函数和FindWindowEx函数。在pywin32中,他们都属于win32gui的模块。

FindWindow(lpClassName=None, lpWindowName=None):

描述:自顶层窗口(也就是桌面)开始搜索条件匹配的窗体,并返回这个窗体的句柄。不搜索子窗口、不区分大小写。找不到就返回0

参数:

lpClassName:字符型,是窗体的类名,这个可以在Spy++里找到。

lpWindowName:字符型,是窗口名,也就是标题栏上你能看见的那个标题。

说明:这个函数我们仅能用来找主窗口。

FindWindowEx(hwndParent=0, hwndChildAfter=0, lpszClass=None, lpszWindow=None);

描述:搜索类名和窗体名匹配的窗体,并返回这个窗体的句柄。不区分大小写,找不到就返回0。

参数:

hwndParent:若不为0,则搜索句柄为hwndParent窗体的子窗体。

hwndChildAfter:若不为0,则按照z-index的顺序从hwndChildAfter向后开始搜索子窗体,否则从第一个子窗体开始搜索。

lpClassName:字符型,是窗体的类名,这个可以在Spy++里找到。

lpWindowName:字符型,是窗口名,也就是标题栏上你能看见的那个标题。

说明:找到了主窗口以后就靠它来定位子窗体啦。

有了这两个函数,我们就可以写出可以定义到任意一个窗体句柄的函数啦:

def find_idxSubHandle(pHandle, winClass, index=0):

"""

已知子窗口的窗体类名

寻找第index号个同类型的兄弟窗口

"""

assert type(index) == int and index >= 0

handle = win32gui.FindWindowEx(pHandle, 0, winClass, None)

while index > 0:

handle = win32gui.FindWindowEx(pHandle, handle, winClass, None)

index -= 1

return handle

def find_subHandle(pHandle, winClassList):

"""

递归寻找子窗口的句柄

pHandle是祖父窗口的句柄

winClassList是各个子窗口的class列表,父辈的list-index小于子辈

"""

assert type(winClassList) == list

if len(winClassList) == 1:

return find_idxSubHandle(pHandle, winClassList[0][0], winClassList[0][1])

else:

pHandle = find_idxSubHandle(pHandle, winClassList[0][0], winClassList[0][1])

return find_subHandle(pHandle, winClassList[1:])

这样在后续的调用中,我们就能使用我们定义的finde_subHandle来方便地找到某个特定的Edit窗体控件。

比如我们定义一个FaceGenWindow的类:

class FaceGenWindow(object):

def __init__(self, fgFilePath=None):

self.Mhandle = win32gui.FindWindow("FaceGenMainWinClass", None)

print "FaceGen initialization compeleted"

实体化以后就可以很方便地在类的方法中调用find_subHandle函数来找到FaceGenWindow的子窗体了,比如某个Edit控件:

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

另外,python中找回来的句柄都是十进制整型,Spy++里显示的都是十六进制整型,这个要注意下,调试的时候用十六进制输出句柄,如下:

print "%x" % (handle)

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

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

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

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

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

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

    本博客正逐步迁移至OrangeCube四次元 请移步至这里以获得更加的排版和阅读体验,谢谢您 Part 3:控件操作A 通过菜单的目录操作,我们打开了打开文件对话框.为了简单起见,我们可以直接在文件名 ...

  4. 如何用python进行相关性分析_如何利用python进行时间序列分析

    题记:毕业一年多天天coding,好久没写paper了.在这动荡的日子里,也希望写点东西让自己静一静.恰好前段时间用python做了一点时间序列方面的东西,有一丁点心得体会想和大家分享下.在此也要特别 ...

  5. python朋友圈动态_如何利用Python网络爬虫爬取微信朋友圈动态--附代码(下)

    前天给大家分享了如何利用Python网络爬虫爬取微信朋友圈数据的上篇(理论篇),今天给大家分享一下代码实现(实战篇),接着上篇往下继续深入. 一.代码实现 1.修改Scrapy项目中的items.py ...

  6. 如何用python修改pdf内容_如何利用python将pdf文件转化为txt文件?

    https://www.wukong.com/answer/6579491774144708872/?iid=15906422033&app=news_article&share_an ...

  7. python计算圆周率近似值_怎样利用python来计算出圆周率π-百度经验

    怎样利用python来计算出圆周率π? 方法/步骤 1 圆周率π是一个无理数,没有任何一个精确公式可以计算出π值,π的计算只能采用近似算法. 我们利用蒙特卡洛方法来求得π的近似值. 蒙特卡洛方法是利用 ...

  8. 利用python查询电脑配置_干货|利用Python将地址转换为经纬度坐标

    本文主要讲述利用Python将文本格式的地址转换为数字格式的经纬度坐标数据,主要步骤有: 注册高德地图API账号,申请Web服务的Key 了解并测试地理编码API服务 利用Python实现地址转坐标 ...

  9. python制作雷达图_如何利用Python matplotlib绘制雷达图

    本篇文章介绍使用matplotlib绘制雷达图. 雷达图也被称为网络图,蜘蛛图,星图,蜘蛛网图,是一个不规则的多边形.雷达图可以形象地展示相同事物的多维指标,雷达图几乎随处可见,应用场景非常多. 一. ...

最新文章

  1. 网络DevOps探索与实践
  2. 手把手教你如何配置fiddler、并开启手机代理抓包、最详细
  3. feng作品推荐あかね色に染まる坂 染成茜色的坂道 (含下载、攻略)
  4. WinCE中断结构分析
  5. 算法之组合数学及其算法篇(二) ----- 鸽巢原理
  6. Android插件化开发之动态加载基础之ClassLoader工作机制
  7. python语言三大基本控制结构_Python基础知识之4——三大控制结构
  8. 诊断域帐号被锁定的原因
  9. HDU2176 取(m堆)石子游戏【Nim博弈】
  10. GIS电力平台功能需求
  11. celery(分布式任务队列)介绍+在django中异步回调使用+定时任务的使用
  12. TF_REPEATED_DATA ignoring data with redundant timestamp for frame left_wheel at time
  13. 超简单集成华为HMS Core MLKit 机器学习服务银行卡识别SDK,一键实现银行卡绑定
  14. uni-app checkbox和switch组件checked属性无效的解决方案
  15. input表单元素required用法
  16. 摩拜ofo均取消月卡优惠;陌陌7.35亿美元收购探探;京东腾讯入股步步高丨价值早报
  17. 如何在 DAX 计算中隐藏未来日期?
  18. ArcGIS 9.3 下载
  19. 利用爬虫、SMTP和树莓派3B发送邮件续集(爬取墨迹天气预报信息)
  20. \u*格式转码成中文

热门文章

  1. WPF WrapPanel
  2. 全文索引——CONTAINS 语法代码
  3. python箴言_字字箴言:为什么我劝你别盲目追风 Python?
  4. java常用7款反编译工具
  5. 签名和包名version Nameversion Code
  6. win10 tightvnc 连接(多个)树莓派远程桌面控制
  7. 安卓应用签名机制分析
  8. wpf嵌入资源html,WPF 嵌入的资源的图片读取与转换
  9. php 汇率接口,利用yahoo汇率接口实现实时汇率转换示例 汇率转换器
  10. java fetch_解析Fetch实现请求数据