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

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

  •  6
     
  •   JeffersonQin · 116 天前 · 2325 次点击
    这是一个创建于 116 天前的主题,其中的信息可能已经有所发展或是发生改变。

    Ayase

    项目 repo:Github/[email protected]

    截图在 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 条附言  ·  116 天前

    前面发了一个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
       116 天前
    Namoe
        2
    Namoe  
       116 天前
    请问有 release 版本吗,build 有点折磨
    PainAndLove
        3
    PainAndLove  
       116 天前
    mac 能用吗
    internelp
        4
    internelp  
       116 天前
    🐂
    JeffersonQin
        5
    JeffersonQin  
    OP
       116 天前
    @Namoe 我马上去 github 上发个 release,稍等(都忘了这茬了🤣
    JeffersonQin
        6
    JeffersonQin  
    OP
       116 天前
    @PainAndLove 不能 这个是用 win32api 实现的主要功能,不过 mac 也有相应的 accessibility 接口,可以了解一下 applescript ( osascript )以及 Inspector 工具。我现在不用 mac 了,以前用了很多年,玩过这方面的东西。
    gauzung
        7
    gauzung  
       116 天前
    一直在用浏览器端的 vimium,也想着有没有浏览器以外也有类似的软件,终于看到了
    我感觉 vimium 这种点击交互效率更高,不知道楼主有没有考虑过
    JeffersonQin
        8
    JeffersonQin  
    OP
       116 天前
    @gauzung 这个工具当初我想到做这个东西的时候其实朋友安利过我。但是我最终考虑下来觉得他还是不够“intuitive”,现在的话是“看到什么就搜什么”,个人认为更加符合直觉。而且如果我用这种模式,大多数情况下我其实只需要加上 alt 键就可以了。不过我觉得这个模式以后可能也可以加入(说实话感觉也挺有意思的
    gauzung
        9
    gauzung  
       116 天前
    @JeffersonQin #8 多谢,关注中
    mmmao
        10
    mmmao  
       116 天前
    感觉挺方便的
    AoEiuV020
        11
    AoEiuV020  
       116 天前
    主要问题还是使用场景,日常使用的话,没谁日常使用没有鼠标吧,而有鼠标的情况这种软件有没什么场合能比鼠标更方便,没有的话感觉就很鸡肋了,体验一下就没有然后了,
    yuancoder
        12
    yuancoder  
       116 天前
    费手指
    JeffersonQin
        13
    JeffersonQin  
    OP
       116 天前
    @AoEiuV020 嘛 还是个人喜好问题吧(
    jorneyr
        14
    jorneyr  
       116 天前
    对 DirectUi 的界面支持怎么样?
    JeffersonQin
        15
    JeffersonQin  
    OP
       116 天前
    @jorneyr 可以给个例子嘛(我去测试下
    jorneyr
        16
    jorneyr  
       116 天前
    @JeffersonQin 好像迅雷,VS Studio 都是,或者 WPF 之类开发的界面程序。
    qq316107934
        17
    qq316107934  
       116 天前
    大概无障碍服务使用者的福音。
    好奇是咋拿到 Electron 和 WPF 开发的 UI Tree 的,只知道传统的 Win32 控件绘制可以靠遍历子句柄,但是我前面提到的那俩是自己做的渲染,只能拿到一整个 Webkit 或者 Window 句柄。
    pabupa
        18
    pabupa  
       116 天前
    帅!!!!!!!!!!
    JeffersonQin
        19
    JeffersonQin  
    OP
       116 天前
    @jorneyr 我测试了一下:迅雷, Visual Studio, Visual Studio Code, VMWare Workstation, QQ, 微信, Adobe Acrobat, 任务管理器 这几个都是可以的
    JeffersonQin
        20
    JeffersonQin  
    OP
       116 天前   ❤️ 1
    可以搜一下 uiautomation . h , 我是用这个 api 做的除此之外还可以考虑 MSAA,不过我测试下来这个效果会差很多速度也慢很多,而且本身要也要比 uiautomation 老很多了。我博客上有具体的记录:gyrojeff 点 top (置顶的几篇文章后面的十几篇就是
    qq316107934
        21
    qq316107934  
       116 天前
    @JeffersonQin #20 看完博客后要向楼主交代一个残酷的事实:博客文章比这个项目要更加吸引我😂,文章质量很高,封面也好看,已加入收藏夹
    qq316107934
        22
    qq316107934  
       116 天前   ❤️ 1
    以及 Aayase 第一反应还以为是 YOASOBI 的 Producer (
    JeffersonQin
        23
    JeffersonQin  
    OP
       116 天前   ❤️ 1
    @ q/q/3/1/6/1/0/7/9/3/4 草(蚌埠住了
    以及貌似因为你的 id 是 qq 我注册未满 14 天回复不了🤣
    jorneyr
        24
    jorneyr  
       116 天前
    @JeffersonQin 不错不错
    20015jjw
        25
    20015jjw  
       116 天前 via Android
    思路不错
    mac 上的 vimmotion 嘛
    可惜我游戏机不用这些
    jsq2627
        26
    jsq2627  
       116 天前
    以前工作相关接触过 UIA 领域,最后发现 https://github.com/FlaUI/FlaUI 对 UIA 的封装非常好用。
    jsq2627
        27
    jsq2627  
       116 天前
    顺带一提,除了 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  
       115 天前
    想问一下楼主,将 Caps Lock 映射为 Ctrl 后,Alt + Caps Lock 还能触发 UI 识别吗?
    JeffersonQin
        29
    JeffersonQin  
    OP
       115 天前
    @jsq2627 大感谢(我去了解下(不过我看了一下那个 repo,他的原理其实也就是 P/Invoke 调 win32api,然后层层分装,这个性能还是不太行(所以最后我选择了 cpp 写然后搞成 dll
    JeffersonQin
        30
    JeffersonQin  
    OP
       115 天前
    @jsq2627 确实 也希望 UIA 这块能越做越好吧(我这次找资料网上的 demo 都是七八年前的了🤣
    JeffersonQin
        31
    JeffersonQin  
    OP
       115 天前
    @imwangpan 如果你是说键盘做了个 hook 是没关系的, 我也是用 hook 的
    sunxiaonian
        32
    sunxiaonian  
       115 天前 via iPhone
    能封装好收费吗?不收费不敢用了现在
    JeffersonQin
        33
    JeffersonQin  
    OP
       115 天前
    @sunxiaonian 这么说吧 我马上高三了也没太多时间维护 所以就直接扔 github 了 之前发了一个 x86 的 release (需要.net core desktop 3.1.* x86 ) 感兴趣的话可以试一下(
    november
        34
    november  
       115 天前
    还没用上,看了下 gif 图片,怎么感觉像是全局文本搜索?

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