UI Automation 是微軟用來替代 Microsoft Active Accessibility(msaa) 的接口,有服務端和客戶端,對於腳本用戶來說主要就是客戶端相關功能,
可以很大程度地幫助我們獲取更多有效信息,能獲取微信,QQ里的各種內容,還能設置網頁里輸入框內容並點擊按鈕。應用場景很多,對控件的操作應該也是很強悍的,還沒研究透。
AutoHotkey 的庫,首先應該是國人 nepter 寫的,初步的核心問題都解決了
網上應該沒什么 AutoHotkey 關於 UIA 的中文教程(很多編程中文資料都比較欠缺)
借着2020年春節的放假時間,終於下定決心研究下,沒有人指點的學習太難了。
把 UIA 庫升級到 v2 a103,並且部分設計思路按自己想法調整了。
整體思路和示例代碼(包含 inspect.exe)都在附件里→ hyUIA.zip
下載后運行 hyUIA.ah2,谷歌瀏覽器打開百度首頁按F9,鼠標停留在微信消息上按F9,有簡易示例,
F10 可獲取鼠標下的控件信息,其他的請自行看代碼。
里面還有不少內容沒研究清楚,用的還是比較淺的功能,對結構復雜的頁面,應該用哪種方式能更加穩定地獲取控件,還需要進一步學習。
有些功能還是不完善的,主要還是希望能幫助大家入門。有錯誤和意見也希望能留下您的評論,謝謝。
2021年9月份,升級AutoHotkey v2 beta版,拉着天黑請閉眼幫忙升級代碼,他還做了不少簡化,對UIA的使用更加簡潔了,非常感謝!!
#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)
}
}