AutoHotkey 使用 UI Automation(UIA) 獲取相關信息教程


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)
    }
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM