本帖最后由 quitout 于 2015-6-3 18:21 编辑 窗口句柄全面分析
本文由按键学院提供技术支持
按键学院交流①群(1群已满):376122403
按键学院交流②群(2群):372671254
按键学院交流③群(3群):170084238
小编最近比较经常会看到一些新手同学在使用后台命令的时候会遇到各种问题,比如后台鼠标点击失效,移动命令没反应,点击的位置不正确等等的问题。 经过排查,有很大一部分都是窗口句柄的问题。句柄如果找错的话,那后续的操作就会出现问题。 对窗口句柄熟悉的童鞋来说简直是不能太简单,但是对于刚接触按键精灵后台操作的童鞋来说,是一个比较复杂难懂的环节了 今天小编就给大家详细的讲解下关于窗口句柄的知识,还有常用的找句柄命令的技巧 |
想要理解句柄就得先知道窗口句柄的概念。我们先来看下度娘百科上的说法
在windows中,句柄是和对象一一对应的32位无符号整数值。对象可以映射到唯 一的句柄,句柄也可以映射到唯一的对象。 |
看了感觉很绕吧?其实说白了,
每个窗口就相当于对应了一个身份证- 您所在的用户组无法下载或查看附件
每个窗口都对应唯一的一个句柄,不同窗口标题可能相同,但是他们的句柄ID绝对不同。 |
窗口句柄有以下特性:1、一个窗口对应了唯一的句柄 2、一个窗口中可能包含了多个子窗口,每个子窗口也有对应的唯一的句柄。子窗口对应的上级窗口也被称为“父窗口” 3、窗口重启之后句柄就会发生变化 |
在平时的代码编写过程中对于窗口句柄的一些需要注意的,就是上面三个特性了。
一些新手在对窗口进行后台操作的时候无效,主要就是两点导致的,
一个是窗口句柄找错了;第二点就是需要操作的对象是在某个子窗口句柄当中的,而他使用的句柄是父窗口的句柄,所以导致了操作失效。下面就给大家详细说明下不同的找句柄的命令的使用技巧
在按键精灵自带的命令当中,我们通常会使用这几个命令来找句柄:
Find(FindEx ) 命令、
Search(SearchEx ) 命令、
MousePoint 命令
有选择困难症的童鞋就会头疼了,这几个命令到底我要用哪个?别急,小编这里就给大家分析下每个命令
Find(FindEx ) 命令命令名称 | Find |
命令功能 | 查找窗口类名或者标题 |
命令参数 | 参数1 字符串型,窗口类名 参数2 字符串型,窗口标题 |
命令名称 | FindEx |
命令功能 | 根据父窗口句柄查找子窗口匹配类名或者匹配标题 |
命令参数 | 参数1 整数型,父窗口句柄 参数2 整数型,子窗口句柄 参数3 字符串型,匹配类名 参数4 字符串型,匹配标题 |
使用Find命令会返回查找到符合条件的第一个窗口句柄,一般是用来查找当前只存在唯一一个的窗口,比如当前电脑上只开了一个记事本窗口,想要找到这个窗口的话就可以使用Find 命令。使用技巧:Find 命令的标题名称或者类名参数填写0 的话就代表忽略这个参数,如果两个参数都填写0的话,那这个命令会返回桌面顶层窗口中找到的第一个窗口
PS:这个命令使用的是精确查找模式,所填写的标题或者类名必须要完全一致才能找到,比如查找记事本窗口
- Hwnd = Plugin.Window.Find(0, "无标题 - 记事本")
复制代码- Hwnd = Plugin.Window.Find(0, "记事本")
复制代码这两个命令前者可以正确找到记事本句柄,后者则不行,因为标题不完整。
Search(SearchEx )命令命令名称 | Search |
命令功能 | 遍历符合窗口标题的句柄保存到数值串里 |
命令参数 | 参数1 字符串型,窗口符合的标题 |
命令名称 | SearchEx |
命令功能 | 遍历符合窗口标题的句柄保存到数值串里 |
命令参数 | 参数1 字符串型,窗口符合的类名 参数2 字符串型,窗口符合的标题 参数3 字符串型,搜索方式(0:模糊,1:精确) |
Search 查找窗口句柄是会返回所有符合条件的句柄,一般是用于需要查找多窗口的情况,比如想要实现多开挂机,那就需要把当前的窗口都找到,就需要用到Search 或者 SearchEx 命令。这个命令返回的结果是句柄字符串,每个句柄使用“|”符号连接,具体使用的时候需要单独把每个句柄提取出来
还是以获取记事本句柄为例子
- HwndEx = Plugin.Window.Search("记事本")
- Hwnd = split(HwndEx,"|")
- For i = 0 To UBound(Hwnd)-1
- TracePrint Hwnd(i)
- Next
复制代码 在使用这个命令的时候需要注意一点:命令返回的句柄字符串结尾处会跟着一个多余的 “|”符号,所以在使用for命令循环提取句柄的时候,要把循环的次数上限减1,否则提取的最后一个句柄就会是空的值。MousePoint 命令命令名称 | MousePoint |
命令功能 | 得到鼠标指向的窗口句柄 |
命令参数 | 无 |
这个命令是获取到鼠标当前位置的窗口的句柄。这个命令相对上面的两个命令会比较特殊,
他是可以直接获取到子窗口句柄的,而上面两个命令是只能获取到最外面的顶层父窗口句柄(FindEx 命令除外,他是可以指定在某个父窗口下查找子窗口句柄)
新手都很喜欢使用这个命令来获取句柄,因为他很简单易用,不需要多去了解窗口标题和类名。但是同时因为新手对于句柄了解不够,所以很容易出现问题。比如查找记事本句柄:
- 您所在的用户组无法下载或查看附件
童鞋们可以通过按键抓抓来查看下这个记事本窗口的句柄:
- 您所在的用户组无法下载或查看附件
可以发现其实这个记事本是由两层窗口组成的,一个是最外层的父窗口,一个是编辑部分的子窗口。
如果使用MousePoint 命令来获取这个记事本句柄的话,那把鼠标放在标题栏和放在输入内容框里,所获得到的句柄是不同的,鼠标放到输入框的位置,命令是直接获取到了文本编辑器的句柄了。这个也是新手最容易犯的错误,一些游戏窗口里往往都是有很多子窗口的句柄,使用这个命令会不经意间获取到了子窗口句柄,就会导致后台操作部分无法实现。
看到这里有的童鞋可能就觉得这个命令岂不是很鸡肋? 错了,命令是死的,但是人是活的,我们可以利用这个命令能够直接获取到子窗口的句柄这一特性,来获取一些平时我们很难获取到句柄。
比如说获取到画图工具当中的绘制部分的句柄。
(我才不会告诉你这个是认真4级的考试题目…… )使用抓抓工具可以查看到绘制部分的子窗口是没有标题的,只有一个类名,但是这个类名并不是固定的,每次打开画图工具他的类名可能都不相同。那这个情况就可以利用MousePoint 命令了。
- 您所在的用户组无法下载或查看附件
思路就是这样的:先使用Find命令找到画图工具句柄,然后可以把画图窗口移动到固定的位置,设置成固定的窗口大小,然后鼠标再偏移移动到绘制部分的区域,这时候再使用MousePoint 命令就能获取到正确的句柄了。院刊目录showtopic.aspx?topicid=549014&forumpage=1&page=1
谢谢大家阅读,记得给小编送支花花 ! 顺手点个赞