如何利用Python和win32编程避免重复性体力劳动(一)
如何利用Python和win32编程避免重复性体力劳动(一)——开始、FindWindow和FindWindowEx
标签: pythonpywin32FaceGenwin32
2013-12-23 15:06 4267人阅读 评论(11) 收藏 举报
分类:
python(6)
版权声明:本文为博主原创文章,未经博主允许不得转载。
目录(?)[+]
本博客正逐步迁移至OrangeCube四次元
请移步至这里以获得更加的排版和阅读体验,谢谢您
本系列文章假设各位看官对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:字符型,是窗口名,也就是标题栏上你能看见的那个标题。
说明:找到了主窗口以后就靠它来定位子窗体啦。
有了这两个函数,我们就可以写出可以定义到任意一个窗体句柄的函数啦:
[python] view plain copy
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的类:
[python] view plain copy
class FaceGenWindow(object):
def __init__(self, fgFilePath=None):
self.Mhandle = win32gui.FindWindow("FaceGenMainWinClass", None)
print "FaceGen initialization compeleted"
实体化以后就可以很方便地在类的方法中调用find_subHandle函数来找到FaceGenWindow的子窗体了,比如某个Edit控件:
[python] view plain copy
handle = find_subHandle(self.Mhandle, [("ComboBoxEx32", 1), ("ComboBox", 0), ("Edit", 0)])
另外,python中找回来的句柄都是十进制整型,Spy++里显示的都是十六进制整型,这个要注意下,调试的时候用十六进制输出句柄,如下:
[python] view plain copy
print "%x" % (handle)
顶
0
踩
0
上一篇Ubuntu 13.10 64位 ia32-libs未发现软件包 解决办法
下一篇如何利用Python和win32编程避免重复性体力劳动(二)——菜单操作:GetMenu,GetSubMenu,GetMenuItemID以及wParam的HIWORD&LOWORD
相关文章
- 计算机科学论坛--195本免费的在线编程类书籍全是E文
- python一次简单游戏辅助的经历(截取屏幕模拟键盘)
- Python基础08 面向对象的基本概念
- PLC在物料配送系统中的应用
- 数字革命是如何加速创新.推动生产力,改变就业和经济的?读[与机器赛跑]
- 基于RaspberryPi实现的智能家居
- 7月文章试读:恶意代码的亲密接触--病毒编程技术(上)
- 自动化毕业论文--基于PLC的彩灯控制系统
- 会计电算化(上海)
195本免费的在线编程类书籍 全是E文 原作者地址:http://www.techtoolblog.com/archives/195-free-online-programming-books Thanks for everyone sub ...
背景:忆起10年前玩过的网游<热血江湖>.游戏中不定时出现可使用必杀技提示,需要在此时键盘按键(必杀技需根据提示按多个键位)才可使用. 思路一:通过python调用windows大漠插件dm.dll,使用插件中封装好的函数来操作 ...
作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 谢谢逆水寒龙,topmad和Liqing纠错 Python使用类(class)和对象(object),进行面向对象(obj ...
本科生毕业论文(设计) PLC在物料配送系统中的应用料 配送系统中的应用 院 系 专 业 电气工程及其自动化 班 级 学 号 学 生 姓 名 联 系 方 式 指 导 教 师 李耀辉 职 称 讲师 2010年5月 独 创 性 声 明 本人郑重 ...
推荐者:虎嗅互联网浪潮 时间: 2013-4-7 14:19 书名:与机器赛跑 副标题:数字革命如何加速创新.推动生产力,并且不可逆转地改变就业和经济 作者: [美]埃里克·布林约尔松 / [美]安德鲁·麦卡菲 译者:闾佳 出版社:东西文库 ...
摘 要 本文以树莓派为载体进行智能家居控制器的设计.在对现在三种市面上的网络电视的比较中引出毕设的主角--树莓派.首先是LINUX 系统常识性的介绍:然后是在ARM/LINUX平台上面开发应用的两种方法:调用系统已有资源.做程序(C 经典法 ...
7月文章试读:恶意代码的亲密接触--病毒编程技术(上) 文 / 温玉洁 生活在网络时代,无论是作为一名程序员抑或是作为一名普通的电脑使用者,对病毒这个词都已经不再陌生.网络不仅仅是传播信息的快速通道,从另外一个角度来看,也是病毒得以传播和滋 ...
安徽电气工程职业技术学院 毕 业 设 计 (论文) (基于PLC 的彩灯控制系统的设计) 年 级: 学 号: 姓 名: 专 业: 指导老师: 年 月 摘 要 彩灯在我们的日常生活中是随处可见的,彩灯控制能够达到的渲染效果是通过控制全部或者部 ...
第一章 计算机与会计基础知识 1. 管理信息系统是一门:综合管理科学.系统科学.计算机科学.边缘的科学. 三要素:系统的观点.数学的方法.计算机的应用. 2. 1954年通用电气第一次在UNIVAC-1计算机上计算职工工资. 3. 第一台电 ...