通过Acc调试工具获取微信内容的图示
什么是ACC?
ACC(Accessibility,也称为辅助功能接口)是Windows提供的一套API,用于帮助开发者与图形界面元素进行交互,尤其是那些无法通过传统方法(如控件句柄或窗口类名)轻松访问的界面元素。ACC最初是为辅助技术(如屏幕阅读器)设计的,但由于它强大的能力,常被用于自动化脚本和测试工具。
在AutoHotkey中,通过使用ACC库,用户可以直接访问并操作一些“隐藏”在标准控件外部的UI元素。例如,菜单项、按钮、树状视图中的子节点,都可以通过ACC准确定位和操作。它极大地扩展了AutoHotkey处理复杂界面的能力。
为什么使用ACC?
普通的AutoHotkey脚本通常通过窗口标题、控件类名(ClassNN)或控件句柄(Handle)来操作界面,但在以下情况下可能会遇到困难:
- 应用程序的UI元素是自定义控件,传统方法无法捕获。
- 需要操作嵌套的子控件或动态生成的内容。
- 控件无句柄(Handle-less),例如许多现代框架(如WPF、Electron等)渲染的界面。
- 操作复杂的网页内容或需要获取非标准化控件的属性。
在这些场景下,ACC可以直接与控件的逻辑层进行交互,而不依赖传统的控件句柄,因此是一个非常强大的工具。
注意事项
- 复杂性:ACC的使用需要借助调试工具来完成,尤其是定位复杂界面元素时。
- 兼容性:不同的应用程序支持ACC的程度不同,某些控件可能不完全暴露其属性。
- 工具辅助:推荐使用工具 AccViewer 或 UIAViewer 来辅助定位和调试界面元素,工具已集成在AHKEditor编辑器中。
基础用法:
; https://www.autohotkey.com/boards/viewtopic.php?f=6&t=40615 ; 2021.12.11 - 适配当天微信PC版的最新版本:3.4.5.27版本 ; 2022.8.3 - 适配当天微信PC版的最新版本:3.7.5.23版本【将微信窗口最小化可以后台接收】 #SingleInstance Force SetBatchLines -1 #Include <Acc> ; 当前列表的第一个用户的最后一条信息 F1:: oAcc := Acc_Get("Object", "4.1.2.2.2.1.1.1.1.1.1.2.2", 0, "微信") MsgBox % oAcc.accName(1) return F2:: ; 遍历微信当前对话内容 oAcc := Acc_Get("Object", "4.1.2.3.1.1.1.1.2.1.1.1", 0, "微信") 当前对话内容:="" Loop { 当前对话内容 .= oAcc.accName(A_Index) "`n" if (oAcc.accName(A_Index)="") Break } MsgBox % "遍历微信当前对话内容:`n`n" 当前对话内容 MsgBox % "可指定顺序编号:`n`n" oAcc.accName(1) "`n" oAcc.accName(2) "`n" oAcc.accName(3) "`n" oAcc.accName(4) return ; 绝对坐标取ACC文字【左上角坐标55,55没有遮挡的话,就会读取到桌面图标名称】 F3:: oAcc := Acc_ObjectFromPoint("", 55, 55) MsgBox % oAcc.accName(1) "|" oAcc.accName(2) "|" oAcc.accName(3) "|" oAcc.accName(4) return F4:: ; 遍历当前窗口的所有项和取指定控件【示例测试请鼠标对准,自带记事本】 WinGet, hWnd, ID, A ; ============== 以下是针对自带记事本生效 ============== ;编辑控制信息是: 4.1.4 ;读取路径将是 4.1.4 ;而我们将用0与 accValue() oAcc := Acc_Get("Object", "4.1.4", 0, "ahk_id " hWnd) MsgBox % oAcc.accValue(0) ;状态栏信息是: 4.2.4 c2 ;读取路径将是 4.2.4 ;而我们将用2与 accName() oAcc := Acc_Get("Object", "4.2.4", 0, "ahk_id " hWnd) MsgBox % oAcc.accName(2) return F6:: ; 点击记事本的编辑按钮【accDoDefaultAction()应该只适用于标准控件,不是一定有效】[自测微信QQ都不行] ; WinActivate, ahk_class Notepad oAcc := Acc_Get("Object", "3.2", 0, "ahk_class Notepad") Try oAcc.accDoDefaultAction() ; 单击目标控件 return F7:: ; 系统自带记事本 - 获取ACC信息(控件) ControlGet, hCtl1, hWnd,, Edit1, ahk_class Notepad ControlGet, hCtl2, hWnd,, msctls_statusbar321, ahk_class Notepad ;编辑控制信息是: 4 ;读取路径将是 4 ;而我们将用0与 accValue() oAcc := Acc_Get("Object", "4", 0, "ahk_id " hCtl1) MsgBox % oAcc.accValue(0) ;状态栏信息是: 4 c2 ;读取路径将是 4 ;而我们将用2与 accName() oAcc := Acc_Get("Object", "4", 0, "ahk_id " hCtl2) MsgBox % oAcc.accName(2) return
以下 Acc.ahk 应存放在 Lib 文件夹中,供其它脚本使用 #Include 调用。
Acc.ahk
声明:站内资源为整理优化好的代码上传分享与学习研究,如果是开源代码基本都会标明出处,方便大家扩展学习路径。请不要恶意搬运,破坏站长辛苦整理维护的劳动成果。本站为爱好者分享站点,所有内容不作为商业行为。如若本站上传内容侵犯了原著者的合法权益,请联系我们进行删除下架。
评论(0)