
前言
最近整一个项目,它需要能自动操纵设备软件上的某些按钮,来得到我们所期待的设备控制要求。
这样类似的功能,通常都是需要通过获取句柄的方式,然后发送Message来实现。以前我都是用VB6.0来实现,那是一个很老的编程环境,微软也不维护它了。还好,现在有了更为强大和满是甜糖的C#,于是怎样用C#来实现句柄的获取,成了很有趣的探讨内容。
句柄获取的方法,在网络上能搜到很多很多介绍,这里我介绍下我整合的一个句柄获取函数,它通过提供三个参数(Name,Class,Deep)来找到我们所关心的那个控件的句柄。
该函数将句柄的获取过程公式化了,为以后的开发利用提供了很好的通用模块。
先抛出全部代码
using
使用方法
获取句柄,不得不提强大的spy++,我的这个模块的使用,得首先用spy++获取如下基本信息
- 程序主窗口的“标题”
- 程序主窗口的的“类”
- 控件句柄在主窗口的“深度”(这是我这个函数最突出的地方)
一:什么是程序主窗口

二:“标题”和“类”怎样找

三:Deep怎样确认

从图中我们可以看到,我要找到“有道词典”(A)处的句柄,只要用数数的方法一层层地确认到(A)处,然后确定它的层级表示字符串“3-1-1”即可。
类似的(B)处,它的Deep参数为“3-3”,(C)处的Deep为“5"
因为我在解算Deep字符串时用的是正则表达式,所以Deep参数对数值的隔离符号并没有很多要求"3-1-1";"3/1/1";"3;1;1";"3 1 1"等等均可,只要能区分处数值就行。
运行验证



问题点求解
1:通过sendmessage发送消息失败的问题
如开始讲的那样,我获取句柄的根本目的是,用来给第三方应用程序的某个按钮发送Click动作的。比如:非故障的警示对话框的消除;设备程序某个查看窗口的跳出与界面切换等。
但实际使用时常常发现,很多时候标准的WM_LBUTTONDOWN WM_LBUTTONUP 消息并不能触发第三方软件的按钮动作(比如:STC单片机的ISP程序上的按钮)。此时可能需要我们找到所能控制它的消息到底是什么。
2:新出的软件找不到按钮的句柄
这是个很头疼的问题,现在时新主流的软件,用spy++扫过去就只能得到主窗口句柄,而且句柄树下同样干净得很,而它那些按钮明明就摆在那里(可能是XAML技术生成的界面吧)。
如此:句柄的功用将被压缩得无所是处!
迫切想知道,类似的软件没有句柄的帮助,该如何去操纵!
请大神指点!