V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
JeffersonQin
V2EX  ›  分享创造

Ayase - 用键盘代替鼠标的小工具 (直接获取 UI Tree)

  •  6
     
  •   JeffersonQin ·
    JeffersonQin · 2021-08-11 10:38:40 +08:00 · 3424 次点击
    这是一个创建于 961 天前的主题,其中的信息可能已经有所发展或是发生改变。

    Ayase

    项目 repo:Github/Ayase@JeffersonQin

    截图在 Github 上有( V2 不让我发链接(悲

    Ayase 是一款旨在使用键盘对电脑进行控制的软件。其专门为<del>像我这样的懒人</del>打造。众所周知,在普通情况下,我们需要同时使用键盘鼠标对电脑进行控制,然而频繁的键盘与鼠标间的切换回让人身心俱疲,同时使得手腕关节持续疲劳,有害于人的身体健康。Ayase 可以通过搜索的方式精确定位屏幕上的 UI 元素,快速控制。

    Features

    • 支持高 DPI,多显示器不同 DPI,跨屏幕显示
    • 支持 Chrome-based Apps (e.g. Github Desktop)
    • 支持 Electron Apps (e.g. Visual Studio Code)
    • 支持 WinForms, WPF, UWP (e.g. 网易云 UWP)
    • 支持腾讯等多家公司的自研 UI 框架 (e.g. 腾讯的微信、QQ)
    • 页面元素高速读取
    • 支持拼音、拼音首字母搜索 (e.g. 网易云 → wyy / wangyiyun)
    • 忽略大小写

    关于 Accessibility 方面的开发以及速度优化的讨论,可以看我博客的几篇文章 (gyrojeff(dot)top)。最终我采用的实现方案是C++调用Win32API / uiautomation.h编译成dll动态链接库,在C# / WPF项目中通过P/Invoke进行调用。在大多数情况下,速度同比提升将近 80%.

    这是我第一次正儿八经地写WPF / C++,所以如果有什么问题还请大家多提PR / Issues

    Dependencies

    • Microsoft.Toolkit.Uwp.Notifications
    • Notifications.Wpf
    • ToolGood.Words

    使用方法

    • 开始 UI 识别:Alt + CapLocks (我们会自动还原CapLocks状态)
    • 退出识别:Esc
    • 下一个元素:Tab
    • 上一个元素:Shift + Tab
    • 鼠标点击当前选中的 UI 元素:Enter
    • 鼠标移动到当前选中的 UI 元素:Shift + Enter

    TODO

    • 增加语音模块
    • 增加设置功能
    • 使用AWSD进行方向操作
    • 纯控制鼠标模式
    第 1 条附言  ·  2021-08-11 14:33:53 +08:00

    前面发了一个release(事情有点多一开始忘记了

    这里说明一下:由于win32api的鬼畜原因(<del>其实是我也不知道为什么</del>),32位版本会比64位版本效率高很多。所以这次第一个版本只给出了32位binary。以后我可能会为64为版本做一个bridge(因为win32api那块我是用cpp写的,编译的dll)。

    42 条回复    2021-10-05 22:37:41 +08:00
    JeffersonQin
        1
    JeffersonQin  
    OP
       2021-08-11 11:09:12 +08:00
    Namoe
        2
    Namoe  
       2021-08-11 12:11:41 +08:00
    请问有 release 版本吗,build 有点折磨
    PainAndLove
        3
    PainAndLove  
       2021-08-11 13:15:38 +08:00
    mac 能用吗
    internelp
        4
    internelp  
       2021-08-11 13:46:23 +08:00
    🐂
    JeffersonQin
        5
    JeffersonQin  
    OP
       2021-08-11 14:27:04 +08:00
    @Namoe 我马上去 github 上发个 release,稍等(都忘了这茬了🤣
    JeffersonQin
        6
    JeffersonQin  
    OP
       2021-08-11 14:28:08 +08:00
    @PainAndLove 不能 这个是用 win32api 实现的主要功能,不过 mac 也有相应的 accessibility 接口,可以了解一下 applescript ( osascript )以及 Inspector 工具。我现在不用 mac 了,以前用了很多年,玩过这方面的东西。
    gauzung
        7
    gauzung  
       2021-08-11 14:43:01 +08:00
    一直在用浏览器端的 vimium,也想着有没有浏览器以外也有类似的软件,终于看到了
    我感觉 vimium 这种点击交互效率更高,不知道楼主有没有考虑过
    JeffersonQin
        8
    JeffersonQin  
    OP
       2021-08-11 14:48:00 +08:00
    @gauzung 这个工具当初我想到做这个东西的时候其实朋友安利过我。但是我最终考虑下来觉得他还是不够“intuitive”,现在的话是“看到什么就搜什么”,个人认为更加符合直觉。而且如果我用这种模式,大多数情况下我其实只需要加上 alt 键就可以了。不过我觉得这个模式以后可能也可以加入(说实话感觉也挺有意思的
    gauzung
        9
    gauzung  
       2021-08-11 14:52:38 +08:00
    @JeffersonQin #8 多谢,关注中
    mmmao
        10
    mmmao  
       2021-08-11 15:00:38 +08:00
    感觉挺方便的
    AoEiuV020
        11
    AoEiuV020  
       2021-08-11 15:37:29 +08:00
    主要问题还是使用场景,日常使用的话,没谁日常使用没有鼠标吧,而有鼠标的情况这种软件有没什么场合能比鼠标更方便,没有的话感觉就很鸡肋了,体验一下就没有然后了,
    yuancoder
        12
    yuancoder  
       2021-08-11 15:38:44 +08:00
    费手指
    JeffersonQin
        13
    JeffersonQin  
    OP
       2021-08-11 15:47:26 +08:00
    @AoEiuV020 嘛 还是个人喜好问题吧(
    jorneyr
        14
    jorneyr  
       2021-08-11 17:06:21 +08:00
    对 DirectUi 的界面支持怎么样?
    JeffersonQin
        15
    JeffersonQin  
    OP
       2021-08-11 17:13:25 +08:00
    @jorneyr 可以给个例子嘛(我去测试下
    jorneyr
        16
    jorneyr  
       2021-08-11 18:18:34 +08:00
    @JeffersonQin 好像迅雷,VS Studio 都是,或者 WPF 之类开发的界面程序。
    qq316107934
        17
    qq316107934  
       2021-08-11 18:23:42 +08:00
    大概无障碍服务使用者的福音。
    好奇是咋拿到 Electron 和 WPF 开发的 UI Tree 的,只知道传统的 Win32 控件绘制可以靠遍历子句柄,但是我前面提到的那俩是自己做的渲染,只能拿到一整个 Webkit 或者 Window 句柄。
    pabupa
        18
    pabupa  
       2021-08-11 18:30:04 +08:00
    帅!!!!!!!!!!
    JeffersonQin
        19
    JeffersonQin  
    OP
       2021-08-11 18:31:46 +08:00
    @jorneyr 我测试了一下:迅雷, Visual Studio, Visual Studio Code, VMWare Workstation, QQ, 微信, Adobe Acrobat, 任务管理器 这几个都是可以的
    JeffersonQin
        20
    JeffersonQin  
    OP
       2021-08-11 18:39:02 +08:00   ❤️ 1
    可以搜一下 uiautomation . h , 我是用这个 api 做的除此之外还可以考虑 MSAA,不过我测试下来这个效果会差很多速度也慢很多,而且本身要也要比 uiautomation 老很多了。我博客上有具体的记录:gyrojeff 点 top (置顶的几篇文章后面的十几篇就是
    qq316107934
        21
    qq316107934  
       2021-08-11 20:05:55 +08:00
    @JeffersonQin #20 看完博客后要向楼主交代一个残酷的事实:博客文章比这个项目要更加吸引我😂,文章质量很高,封面也好看,已加入收藏夹
    qq316107934
        22
    qq316107934  
       2021-08-11 20:06:20 +08:00   ❤️ 1
    以及 Aayase 第一反应还以为是 YOASOBI 的 Producer (
    JeffersonQin
        23
    JeffersonQin  
    OP
       2021-08-11 20:14:10 +08:00   ❤️ 1
    @ q/q/3/1/6/1/0/7/9/3/4 草(蚌埠住了
    以及貌似因为你的 id 是 qq 我注册未满 14 天回复不了🤣
    jorneyr
        24
    jorneyr  
       2021-08-11 21:21:31 +08:00
    @JeffersonQin 不错不错
    20015jjw
        25
    20015jjw  
       2021-08-11 23:42:56 +08:00 via Android
    思路不错
    mac 上的 vimmotion 嘛
    可惜我游戏机不用这些
    jsq2627
        26
    jsq2627  
       2021-08-12 02:06:32 +08:00
    以前工作相关接触过 UIA 领域,最后发现 https://github.com/FlaUI/FlaUI 对 UIA 的封装非常好用。
    jsq2627
        27
    jsq2627  
       2021-08-12 02:25:22 +08:00
    顺带一提,除了 System.Windows.Automation 和 COM,微软最近还在 winrt API 下也加入了一套 UI Automation 相关 API (虽然猜测底层和 COM 一样)
    https://docs.microsoft.com/en-us/uwp/api/windows.ui.uiautomation.automationelement?view=winrt-20348

    UI Automation 很多年没更新了,它的 IPC 架构导致性能非常差,比如 64 位比 32 位慢,猜测就是 IPC 层要做很多转换导致。微软最近也在做一些新的尝试:
    https://news.ycombinator.com/item?id=24294070
    imwangpan
        28
    imwangpan  
       2021-08-12 09:09:00 +08:00
    想问一下楼主,将 Caps Lock 映射为 Ctrl 后,Alt + Caps Lock 还能触发 UI 识别吗?
    JeffersonQin
        29
    JeffersonQin  
    OP
       2021-08-12 09:42:09 +08:00
    @jsq2627 大感谢(我去了解下(不过我看了一下那个 repo,他的原理其实也就是 P/Invoke 调 win32api,然后层层分装,这个性能还是不太行(所以最后我选择了 cpp 写然后搞成 dll
    JeffersonQin
        30
    JeffersonQin  
    OP
       2021-08-12 09:43:59 +08:00
    @jsq2627 确实 也希望 UIA 这块能越做越好吧(我这次找资料网上的 demo 都是七八年前的了🤣
    JeffersonQin
        31
    JeffersonQin  
    OP
       2021-08-12 09:44:33 +08:00
    @imwangpan 如果你是说键盘做了个 hook 是没关系的, 我也是用 hook 的
    sunxiaonian
        32
    sunxiaonian  
       2021-08-12 11:05:59 +08:00 via iPhone
    能封装好收费吗?不收费不敢用了现在
    JeffersonQin
        33
    JeffersonQin  
    OP
       2021-08-12 11:33:22 +08:00
    @sunxiaonian 这么说吧 我马上高三了也没太多时间维护 所以就直接扔 github 了 之前发了一个 x86 的 release (需要.net core desktop 3.1.* x86 ) 感兴趣的话可以试一下(
    november
        34
    november  
       2021-08-12 12:13:10 +08:00
    还没用上,看了下 gif 图片,怎么感觉像是全局文本搜索?

    对中文友好吗?我意思是说操作中文文本控件。
    JeffersonQin
        35
    JeffersonQin  
    OP
       2021-08-12 12:19:04 +08:00
    @november 中文的话支持拼音和拼音首字母搜索 可以看那个 edge 的例子 "搜索框" 我打了 "ss" 就跳出来了
    expkzb
        36
    expkzb  
       2021-08-12 21:16:05 +08:00
    我看这个 ayase 有点眼熟,原来是我认识的女演员 ayase ren
    JeffersonQin
        37
    JeffersonQin  
    OP
       2021-08-12 21:34:18 +08:00
    @expkzb 嘛... 虽然我想的是 Mitsukasa Ayase (三司绫濑) (yuzusoft yyds 🤣
    xml123
        38
    xml123  
       2021-08-15 10:41:41 +08:00
    试用了一下感觉非常 nb,个人是非常想要这种用键盘取代鼠标功能的软件的,可惜一直没找到好用的。(对比同类型的 KeyMouse 和 hunt and peck )按键识别率很高(这种工具如果有识别不到的按钮,实用性就大打折扣了),至于触发方式是标签还是按键对应的文本我倒是觉得都可以。
    不过似乎不支持资源管理器?也不像是权限的问题,用管理员权限启动也不行。焦点在资源管理器上时,会去标记任务栏上的 UI 元素,不太清楚是怎么回事。
    主要的缺点就是整体的响应速度比较慢,能明显的看到按钮绘制的过程(按右下角弹出的计时,大概在 0.2~0.6s 这个量级,不知道在作者本人的电脑上的速度如何),不知道速度还能不能再优化。而且感觉不太稳定,使用时有卡死和崩溃的情况出现。另外好像也没有双击和右键的功能。(项目看上去还在初期,一些还不能自定义的东西就不一一提了)
    PS:看到 ayase 都没人联想到俺妹了吗(
    JeffersonQin
        39
    JeffersonQin  
    OP
       2021-08-15 17:22:21 +08:00
    @xml123 其实是这样的,建议使用管理员运行。关于 explorer 的问题,您说的是对的,这是一个已知 issue,我正在修复。现在我的识别原理里是检测 foreground 窗口句柄,通过句柄获取 process ID,再通过 process ID 获取 UIA 中的第一个窗口元素。然而问题就出在了这里。explorer 有若干个窗口,一般就会获取 taskbar (底下的任务栏)。接下来准备直接通过 Hwnd 来获取 UIA 元素,相关 API 已经确认过了。谢谢支持哇(求 star (雾
    JeffersonQin
        40
    JeffersonQin  
    OP
       2021-08-15 17:23:09 +08:00
    @xml123 以及关于绘制,这估计就是 wpf 的极限了(悲)( wpf 本身就是用 direct x 绘制的,并非 GDI+
    bianz103
        41
    bianz103  
       2021-10-05 20:22:53 +08:00 via iPhone
    请问识别控件树用的什么方法?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2760 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 12:09 · PVG 20:09 · LAX 05:09 · JFK 08:09
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.