通过Acc调试工具获取微信内容的图示

 

什么是ACC?

ACC(Accessibility,也称为辅助功能接口)是Windows提供的一套API,用于帮助开发者与图形界面元素进行交互,尤其是那些无法通过传统方法(如控件句柄或窗口类名)轻松访问的界面元素。ACC最初是为辅助技术(如屏幕阅读器)设计的,但由于它强大的能力,常被用于自动化脚本和测试工具。

在AutoHotkey中,通过使用ACC库,用户可以直接访问并操作一些“隐藏”在标准控件外部的UI元素。例如,菜单项、按钮、树状视图中的子节点,都可以通过ACC准确定位和操作。它极大地扩展了AutoHotkey处理复杂界面的能力。

 

为什么使用ACC?

普通的AutoHotkey脚本通常通过窗口标题、控件类名(ClassNN)或控件句柄(Handle)来操作界面,但在以下情况下可能会遇到困难:

  • 应用程序的UI元素是自定义控件,传统方法无法捕获。
  • 需要操作嵌套的子控件或动态生成的内容。
  • 控件无句柄(Handle-less),例如许多现代框架(如WPF、Electron等)渲染的界面。
  • 操作复杂的网页内容或需要获取非标准化控件的属性。

在这些场景下,ACC可以直接与控件的逻辑层进行交互,而不依赖传统的控件句柄,因此是一个非常强大的工具。

 

注意事项

  1. 复杂性:ACC的使用需要借助调试工具来完成,尤其是定位复杂界面元素时。
  2. 兼容性:不同的应用程序支持ACC的程度不同,某些控件可能不完全暴露其属性。
  3. 工具辅助:推荐使用工具 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

声明:站内资源为整理优化好的代码上传分享与学习研究,如果是开源代码基本都会标明出处,方便大家扩展学习路径。请不要恶意搬运,破坏站长辛苦整理维护的劳动成果。本站为爱好者分享站点,所有内容不作为商业行为。如若本站上传内容侵犯了原著者的合法权益,请联系我们进行删除下架。