窗体|窗体监听004:常用快速查找窗口句柄方法封装


在文章【窗体监听002:利用递归查找窗口句柄实现快速取值】我们通过递归或回调实现了快速获取目标窗口的句柄 , 借用函数FindWindowEx来获取子窗口及兄弟窗口的句柄并定义一个列表来存储子窗口的句柄 , 然后在循环调用函数本身直到找到符合要求的句柄 。 但在我们实际应用中很多窗口并不会同时提供类名和窗口名 , 像我们这次要采集的Omega P7软体不仅嵌套的窗口层级很深 , 而且类名还几近相同同时控件文本还多数为空 。
窗体|窗体监听004:常用快速查找窗口句柄方法封装
本文插图

通过类名和控件信息获取窗口句柄
为了适用多种情况的查询 , 针对不同的查询条件封装一个查询函数方便后续快速调用 。 前面我对同时满足类名和控件信息的情况进行了封装 , 在文章【窗体监听003:SendMessage获取窗口信息详解】我提到了GetWindowText获取有时会获取控件信息失败 , 所以这里我们优化下之前的封装 。

窗体|窗体监听004:常用快速查找窗口句柄方法封装
本文插图
通过类名+标题回调获取窗口句柄


还有一种方法就是利用委托事件事件函数回调 , 每当调用EnumChildWindows函数时调用委托事件来执行调用函数本身达到递归的效果 。 EnumChildWindows会枚举属于指定父窗口的子窗口 , 直到枚举最后一个子窗口或回调函数返回FALSE为止 。 这里需要先定义你需要查询的类名和标题名称 , 当FindWindowEx查询到符合条件的句柄后跳出函数 。
窗体|窗体监听004:常用快速查找窗口句柄方法封装
本文插图

通过类名获取窗口句柄
当你的目标窗口的文本信息非固定值时在获取句柄的时候我们就不能通过类名和控件信息来获取窗口句柄 , 这时候我们只能找符合类名条件的窗口句柄 。 这种方案适合查找窗口类名唯一的控件 , 像Omega P7这种嵌套10来层且类名都一样的窗口肯定是不适用的 。
窗体|窗体监听004:常用快速查找窗口句柄方法封装
本文插图

通过类名回调获取窗口句柄
跟前面一样通过回调触发委托事件来调用函数本身 , 循环中通过FindWindowEx查询符合类名条件的句柄 。 这里需要注意的是参数标题为空 , 不是空字符串而是string.Empty或者null , 这样程式就会去匹配所有满足类名的窗口 。

窗体|窗体监听004:常用快速查找窗口句柄方法封装
本文插图
通过标题名称获取窗口句柄


在窗体中有些控件文本信息是固定的 , 像Omega P7中这个坐标就是固定值而且在整个窗体中也只出现一次 。 像这种情况我们就可以直接去查找指定窗口文本信息的句柄 , 当然像这种固定的文本信息一般都使用label控件 , 直接用GetWindowText函数查找即可 。
窗体|窗体监听004:常用快速查找窗口句柄方法封装
本文插图

通过标题回调获取窗口句柄
这个跟通过类名回调获取窗口句柄基本一样 , 只是查询的参数不是类名而是标题名称了 。 通过EnumChildWindows枚举一个父窗口的所有子窗口 , 回调函数的返回值将会影响到函数的行为 。 如果回调函数返回true则枚举继续直到枚举完成 , 如果返回false则将终止枚举 。
窗体|窗体监听004:常用快速查找窗口句柄方法封装
本文插图

总结:
想采集窗口中的数据最主要的就是快速找到对应的窗口句柄 , 而获取句柄可以通过Microsoft Spy++查看窗体的具体结构来选择适用的方法 。 以上内容是小编给大家分享的【窗体监听004:常用快速查找窗口句柄方法封装】 , 希望对大家有所帮助 , 如果大家有任何疑问请给我留言 , 小编会及时回复大家的 。
窗体|窗体监听004:常用快速查找窗口句柄方法封装
本文插图

【窗体|窗体监听004:常用快速查找窗口句柄方法封装】


    推荐阅读