利用API来快速准确实现点击
本文由按键学院提供技术支持
按键学院交流①群(1群已满):376122403
按键学院交流②群(2群):372671254
按键学院交流③群(3群):170084238
【按键学院】安卓课程(115768679)
咳咳,有一段时间没发布PC端的院刊教程了,今天就给大家带来的就是PC按键的教程了。 PC按键对于游戏方面的操作、识别等等方面比较轻松容易。但是对于比较纯粹针对软件操作,会显得比较麻烦一些,像是要点击按钮、选择多选框、单选框之类的基础操作,一般是利用图色或者是做成字库去识别,要想稳定谨慎的话还得还得再判断是否真的操作成功。想想这些就头疼。 今天就给大家介绍一个系统API的函数,可以轻松、快速、准确的对软件窗口进行操作 |
API介绍
名称 | SendMessage |
声明 | Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) |
功能 | 调用一个窗口的窗口函数,将一条消息发给那个窗口。除非消息处理完毕,否则该函数不会返回 |
参数 | hwnd ,要接收消息的那个窗口的句柄 wMsg ,消息的标识符 wParam ,具体取决于消息 lParam,具体取决于消息 |
返回值 | 由具体的消息决定 |
名称 | GetDlgItem |
声明 | Declare Function GetDlgItem Lib "user32" Alias "GetDlgItem" (ByVal hDlg As Long, ByVal nIDDlgItem As Long) As Long |
功能 | 在指定的窗口内查找并返回指定标示ID控件的句柄 |
参数 | hwnd ,要接收消息的那个窗口的句柄 ID,接收消息的控件的标识 |
返回值 | 控件的句柄 |
一些同学看着这些说明可能会一头雾水,其实SendMessage 这个命令的功能转换成大白话就是“给我一个句柄,让我对它干嘛就干嘛!” (嗯嗯,大概就这意思)
GetDlgItem 这个命令呢就是用来根据控件的标识ID来获取到这个控件的句柄的。用这个命令可以快速准确的获取到按钮控件的句柄标识ID介绍
标识ID和窗口句柄是有些类似,都是用来和其他的控件、窗口进行区分的。但是标识ID和窗口句柄又有差异,窗口句柄在每次重启窗口后会自动改变,但是在同一个窗口中每个控件的标识ID是固定的(就算重启软件数值也不会改变) |
针对这种特性,我们就可以轻易的去查找一些标题为空的按钮的句柄了。
比如说计算器上的按钮,我们用彗星小助手工具来查找下计算器上的按钮的属性
- 您所在的用户组无法下载或查看附件
我们可以发现这个按钮的标题属性是空的,按照常规的根据标题和类名找句柄的方法肯定是很困难的,因为拥有相同类名的控件太多了,无法区分。
这种情况我们就可以直接利用标识ID来准确的识别这个按钮的句柄,不用考虑标题类名之类的。
根据这个标识ID在一个窗口内的唯一性,我们可以通过父窗口句柄还有标识ID来遍历查找到这个控件的句柄
还记得之前院刊有发布过一篇利用递归算法来遍历父窗口下的所有子窗口吗?这里也是同样利用了递归算法
遍历子窗口源码分享- Function GetDlgItemEx(Parent, id)
- Dim RetHWND
- //先判断顶层窗口是否有符合id的句柄
- RetHWND = GetDlgItem(Parent, id)
- If RetHWND Then
- GetDlgItemEx = RetHWND
- Exit Function
- Else
- //递归进行判断每层窗口是否有符合id的句柄
- GetDlgItemEx = GetItem_ScanWindow(Parent, id)
- End If
- End Function
- Function GetItem_ScanWindow(Parent, id)
- Dim RetHWND, WinHWND
- Do
- WinHWND = Plugin.Window.FindEx(Parent, WinHWND, 0, 0)
- If WinHWND Then
- RetHWND = GetDlgItem(Parent, id)
- If RetHWND Then
- GetItem_ScanWindow = RetHWND
- Exit Function
- Else
- GetItem_ScanWindow = GetItem_ScanWindow(WinHWND, id)
- If GetItem_ScanWindow Then
- Exit Function
- End If
- End If
- End If
- Loop While WinHWND
- End Function
复制代码 SendMessage 命令介绍
现在我们已经可以比较轻松的获取到某个按钮控件的句柄了,那我们接下来就是用SendMessage 命令对这个按钮进行操作了。这里就附上一些常用的操作作为范例
1、按钮的点击- 您所在的用户组无法下载或查看附件
- Dim hwnd,ButtonHandle
- hwnd = Plugin.Window.Find("", "计算器")
- If hwnd <> "" Then
- ButtonHandle = GetDlgItemEx(hwnd, 138)
- Else
- TracePrint "未找到计算器窗口"
- End If
- //通过SendMessage点击数字8按钮
- SendMessage ButtonHandle, 245, 0, 0
复制代码这里的SendMessage 第二个参数245代表往这个句柄里发送个【点击按钮】的消息。 |
2、选择多选框- 您所在的用户组无法下载或查看附件
- Dim hwnd,ButtonHandle
- hwnd = Plugin.Window.Find("ThunderRT6FormDC", "千宇智能关机")
- If hwnd <> 0 Then
- ButtonHandle = GetDlgItemEx(hwnd,21) '多选框[重启]的标识ID是21
- Else
- TracePrint "未找到窗口"
- End If
- //通过SendMessage勾选上[重启]
- SendMessage ButtonHandle, 241, true, 0
复制代码这里的第二个参数241是代表设置复选框的选择状态,第四个参数是设置勾选或者不勾选,true代表勾选,false代表不勾选 |
3、下拉框选项选择- 您所在的用户组无法下载或查看附件
- Dim hwnd,ButtonHandle
- hwnd = Plugin.Window.Find("ThunderRT6FormDC", "千宇智能关机")
- If hwnd <> 0 Then
- ButtonHandle = GetDlgItemEx(hwnd,26) '计时方式的下拉框标识ID是26
- Else
- TracePrint "未找到窗口"
- End If
- //通过SendMessage来选择下拉框的选项
- SendMessage ButtonHandle, 334, 2, 0
复制代码这里的第二个参数334是代表设置指定的列表项为当前选择项,第四个参数是设置指定的项,从0开始计算,第一项为0,第二项为1以此类推。 |
通过这三个范例大家可以发现,使用SendMessage 来操作软件有很大的优点
1、代码简单。只需要获取到按钮的句柄,就可以利用一个命令去设置按钮的各种状态
2、操作精准。用这种方法来操作按钮控件,不需要多去判断是否操作成功,可以实现100%的成功率
3、无干扰。这种方式是直接通对窗口发送系统消息来达到操作的目的,所以是属于后台的操作,不会受到前台的影响其实除了这三种最常见的操作外,还能实现非常丰富的功能,比如修改按钮文字、隐藏按钮、修改下拉框内的选项、修改按钮样式等等功能。这里就不一一的举例了。大家可以百度搜索窗口消息命令自行探索。
- 您所在的用户组无法下载或查看附件