UI Automation 是微软用来替代 Microsoft Active Accessibility(msaa) 的接口,有服务端和客户端,对于脚本用户来说主要就是客户端相关功能,
可以很大程度地帮助我们获取更多有效信息,能获取微信,QQ里的各种内容,还能设置网页里输入框内容并点击按钮。应用场景很多,对控件的操作应该也是很强悍的,还没研究透。
AutoHotkey 的库,首先应该是国人 nepter 写的,初步的核心问题都解决了
网上应该没什么 AutoHotkey 关于 UIA 的中文教程(很多编程中文资料都比较欠缺)
借着2020年春节的放假时间,终于下定决心研究下,没有人指点的学习太难了。
把 UIA 库升级到 v2 a103,并且部分设计思路按自己想法调整了。
整体思路和示例代码(包含 inspect.exe)都在附件里→ hyUIA.zip
下载后运行 hyUIA.ah2,谷歌浏览器打开百度首页按F9,鼠标停留在微信消息上按F9,有简易示例,
F10 可获取鼠标下的控件信息,其他的请自行看代码。
里面还有不少内容没研究清楚,用的还是比较浅的功能,对结构复杂的页面,应该用哪种方式能更加稳定地获取控件,还需要进一步学习。
有些功能还是不完善的,主要还是希望能帮助大家入门。有错误和意见也希望能留下您的评论,谢谢。
#include Class_UIA.ah2
#SingleInstance force
F12::reload
F10:: { ;查看当前鼠标下的信息(可用记事本 关于 菜单测试)
UIA.ElementFromPoint().see()
}
F9:: {
if WinActive("ahk_class Chrome_WidgetWin_1") { ;谷歌浏览器
if WinActive("百度一下") { ;百度模拟搜索
idA := WinGetID()
;设置搜索内容
elEdit := UIA.GetFocusedElement()
elEdit.GetCurrentPattern("Value").SetValue("火冷-博客园")
sleep(2000)
;点击搜索按钮
el := UIA.FindElement(idA, "Button", "百度一下")
el.GetCurrentPattern("Invoke").Invoke()
return
} else { ;谷歌获取网址
UIA.ElementFromHandle(ControlGetHwnd("Chrome_RenderWidgetHostHWND1", "A")).see()
}
} else if WinActive("ahk_class WeChatMainWndForPC") { ;微信右键消息内容并点击多选
if !WinExist("ahk_class CMenuWnd")
send("{RButton}")
WinWait("ahk_class CMenuWnd")
try
UIA.FindElement(WinGetID(), "MenuItem", "多选").ClickByMouse()
} else {
;记事本测试
run("notepad.exe")
WinWaitActive("ahk_class Notepad")
ControlSetText("123123", "Edit1")
el := UIA.GetFocusedElement()
msgbox("当前内容 = 123123`n确定后会尝试用 UIA 修改当前内容",,0x40000)
el.GetCurrentPattern("Value").SetValue("修改后")
tooltip("等待关闭记事本")
WinWaitClose()
tooltip
;环境变量(win10 测试通过)
run("rundll32.exe sysdm.cpl,EditEnvironmentVariables")
WinWaitActive("环境变量")
hwnd := WinGetID() ;通过窗口找控件(非标准窗口要用到)
;msgbox("遍历所有按钮,按任意键继续")
;elWin := UIA.ElementFromHandle(hwnd)
;cond := UIA.CreatePropertyCondition("ControlType", "Button")
;for el in elWin.FindAll(cond)
; el.see(0)
msgbox("查找指定的按钮`n方式1",,0x40000)
cond := UIA.CreateAndCondition(UIA.CreatePropertyCondition("ControlType", "Button"), UIA.CreatePropertyCondition("Name", "确定"))
el := UIA.ElementFromHandle(hwnd).FindFirst(cond)
el.see(0)
msgbox("查找指定的按钮`n方式2",,0x40000)
el := UIA.FindElement(hwnd, "Button", "确定")
el.see(0)
msgbox("点击新建按钮",,0x40000)
el := UIA.FindElement(hwnd, "Button", "新建(N)...")
el.GetCurrentPattern("Invoke").Invoke()
msgbox("演示结束",,0x40000)
}
}
好东西!感谢分享!
感谢分享!