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 可获取鼠标下的控件信息,其他的请自行看代码。

里面还有不少内容没研究清楚,用的还是比较浅的功能,对结构复杂的页面,应该用哪种方式能更加稳定地获取控件,还需要进一步学习。
有些功能还是不完善的,主要还是希望能帮助大家入门。有错误和意见也希望能留下您的评论,谢谢。

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

给TA捐赠
共{{data.count}}人
人已捐赠
其他函数教程

AHK演奏——Music库

2022-8-11 21:11:57

应用教程

AHKinfo工具修改版以及修改方法教程

2022-9-1 6:59:41

2 条回复 A文章作者 M管理员
  1. dbgba
    dbgba给您捐赠了¥5
  2. gdzrh917

    好东西!感谢分享!

个人中心
购物车
优惠劵
有新私信 私信列表
搜索