检查一下https://github.com/MonoEven/Autohotkey_Linux这个...

创建于:2026年8月23日

使用 GPT-5.6 Pro 回答 Chat01

回答

结论

截至 2026 年 8 月 23 日,我对 linux-port 分支、当前发布版、兼容性矩阵、弱化功能审计、CI 和部分输入后端源码做了静态检查。

这个项目已经不是“只有解释器能跑”的半成品:AutoHotkey v2 语言层、文件/字符串/对象等通用功能,以及 X11/XWayland 下的桌面自动化已经有相当规模。但它距离“Linux 上可以无脑替代 Windows AutoHotkey”,尤其是距离“原生 Wayland 下完整替代”,仍有明显差距。

我的工程估算是:

实际使用目标当前完成度估算主要差距
把 AHK v2 当作 Linux 通用脚本语言80%–90%少量 Windows 专用 API 和语义差异
X11/Xorg 下做热键、发送、窗口自动化70%–85%外部应用兼容、部分窗口/控件语义、长期稳定性
XWayland 环境自动化 X11 应用65%–80%原生 Wayland 应用仍受限制
原生 Wayland 下做基本全局快捷键和输入发送50%–65%后端差异、权限、组合键和抑制语义
原生 Wayland 下获得完整 AHK 体验25%–40%Hotstring、InputHook、完整 remap、控件自动化尚未闭环
现有 Windows AHK 脚本不修改直接迁移30%–45%COM、注册表、Win32 消息、窗口模型等根本不同
团队或企业生产环境部署40%–55%安全边界、真实环境矩阵、维护者数量、版本成熟度

因此可以概括为:

以“X11/XWayland 下可用的 AHK v2 Linux 移植”为需求,差距约 20%–30%;以“原生 Wayland 上完整、可靠、可生产使用的 AutoHotkey 替代品”为需求,差距约 50%–65%。

这些比例是基于源码和测试证据的工程估算,不是仓库的测试覆盖率。此次没有在真实 GNOME/KDE 物理机上进行装机压力测试。


已经做得比较好的部分

1. 不是简单重写语法,而是基于上游 v2.0.26

仓库基于当前 AutoHotkey v2.0.26 分支移植,语言解释器层不是重新仿制,因而字符串、对象、数组、类、异常、文件、日期和大部分内建函数的基础语义具有较好起点。上游当前最新正式版本同样是 v2.0.26,因此至少暂时不存在明显的解释器版本落后问题。(GitHub)

2. X11/XWayland 是目前最成熟的使用路径

项目声称在 X11/XWayland 下实现了 XGrabKey/XGrabButton、XTEST 输入注入、左右修饰键、通配符、按键抬起事件、组合热键、Hotstring、InputHook、窗口与控件操作、像素和图像搜索、GTK3 GUI 等。兼容矩阵也把 X11 标为功能完整路径。(GitHub)

这并不意味着与 Windows 逐项等价,但说明项目的正确定位应该是:

先把它当作 X11/XWayland 自动化工具,再把原生 Wayland 当作实验功能。

3. 有实质性的 CI、ASan 和回归测试

当前报告记录的是普通构建和 ASan 构建下 1143/1143 个断言、27 个回归测试、17 个 Wayland 测试和 252 个 XWayland 测试。2026 年 8 月 23 日最新提交对应的 CI 也处于成功状态,包括普通构建、ASan、无 XWayland 场景、容器和打包任务。(GitHub)

项目还专门维护了一份“弱化功能审计”,主动记录 COM、注册表、GUI、窗口属性等与 Windows 语义不一致的部分。这比单纯声称“全部支持”要可信得多。(GitHub)


目前存在的主要问题

P0:原生 Wayland 输入捕获还没有形成稳定闭环

GNOME Shell 后端当前主要支持排他式基本热键。仓库自己的文档明确写明,该后端尚不具备完整的:

  • ~ 透传;
  • 键位重映射;
  • a & b 自定义组合;
  • 完整 wildcard;
  • 按键抬起事件消费。

Portal 后端又受到桌面环境、应用身份和用户授权模型影响。(GitHub)

更关键的是,当前兼容矩阵仍然把 原生 Wayland 的 Hotstring 和 InputHook 标为不可用,要求切换到 XWayland/Xorg。窗口和控件自动化也只为原生 Wayland 应用提供了 AT-SPI 的文本读取、文本设置和点击三个基本操作。(GitHub)

因此以下典型 AHK 场景目前不能算完成:

ahk
::addr::完整地址文本 ih := InputHook() CapsLock & j::Send "{Left}" ~LButton up::...

在 Windows 和 X11 中,这些能力依赖连续、全局、可抑制的输入事件流;Portal 或普通桌面快捷键接口无法直接提供同等语义。


P0:新 evdev 捕获代码存在严重的设备筛选与事件丢失风险

这是本次源码检查中最值得优先修复的问题。

当前 core_evdev_linux.cpp 会扫描全部:

text
/dev/input/event*

但设备筛选逻辑只排除了名称为空的设备,以及名称中带 AHK/ahk 的自建 uinput 设备。它没有使用 EVIOCGBITEV_KEY capability、INPUT_PROP_* 等机制确认设备确实是键盘;随后直接尝试 EVIOCGRAB,并把“能否 grab”错误地当作设备是否可用的依据。(GitHub)

后续事件循环又只处理 EV_KEY

cpp
if (ev.type != EV_KEY) continue;

而且只有能映射到有限 Windows VK 表的按键才会通过 uinput 重放。EV_RELEV_ABSEV_SYN、触控板事件、滚轮,以及未进入 VK 映射表的媒体键和鼠标按钮都可能被丢弃。(GitHub)

由代码可以推断:

当实验性 evdev 后端被启用并成功独占鼠标、触控板、游戏手柄或复合 HID 设备时,该设备的部分或全部事件可能不再到达桌面。

仓库已经加入了“Backspace → Escape → Enter”紧急退出序列,触发后释放全部 EVIOCGRAB;这证明维护者也意识到独占输入设备存在把用户锁在桌面外的风险。(GitHub)

不过紧急键不能替代正确的设备识别、完整事件转发和外部 watchdog。

另外,文档仍写着 evdev 后端在 ahk-inputd 发布之前会报告“backend not installed”,而源码已经出现进程内 evdev grab 实现。这说明该功能正处于快速开发中,代码、后端路由和文档尚未同步。(GitHub)

必须先做的修复

  1. EVIOCGBIT 明确检查设备 capability,至少要求字母键、修饰键、Enter/Space 等典型键盘能力。
  2. 明确排除触控板、鼠标、触摸屏、游戏手柄和 composite consumer-control 节点。
  3. 不应以 EVIOCGRAB 是否成功判断设备是不是键盘。
  4. 完成 uinput 创建并验证后,才允许 grab 真实设备,整个过程应具有事务性。
  5. 独占后要么逐事件完整转发原设备能力,要么只独占经过严格认证的纯键盘节点。
  6. 增加虚拟键盘、鼠标、触控板、媒体键和设备热插拔回归测试。
  7. 将 grab 与脚本运行时分离到最小权限 broker;运行时崩溃时 broker 必须自动 fail-open。
  8. 设备数量超过代码中的 64 个 poll 上限时,应明确处理,而不是静默忽略后续设备。(GitHub)

在这些问题解决前,不建议在主力桌面上启用实验性的 evdev 抑制模式


P0:权限模型可能扩大到系统级键盘监听能力

uinput 发送需要 /dev/uinput 权限,evdev 捕获需要读取 /dev/input/event*,源码错误信息目前建议将用户加入 input 组或使用 root。(GitHub)

这会带来两个问题:

  • input 组通常不只是允许 AutoHotkey 读取按键,而是允许该用户上下文中的进程读取原始输入设备;这相当于扩大了键盘记录攻击面。
  • /dev/uinput 权限使进程能够向桌面注入模拟输入。

项目规划中的 ahk-inputd 小型 broker 是正确方向,但需要补齐:

  • Unix socket 的 SO_PEERCRED 身份验证;
  • 每用户、每会话权限隔离;
  • 明确的热键注册协议,而不是把原始键盘流全部暴露给普通脚本;
  • polkit 操作范围收缩;
  • 断开连接、运行时崩溃和 broker 崩溃时自动释放 grab;
  • 防止任意脚本冒充可信客户端;
  • 安装包不得默认把普通用户永久加入高权限 input 组。

P1:测试数字容易被误解为“接近 100% 兼容”

1143/1143 不是“AutoHotkey 兼容度 100%”。

项目自己的审计明确说明:

  • 断言属于采样式语义校验;
  • 合格条件可能只是“不崩溃,并返回结果或抛出预期错误”;
  • 不能证明每个文档行为都被覆盖;
  • 不能证明与 Windows 字节级或完整语义一致。(GitHub)

例如,一个函数在 Linux 上明确抛出“不支持”的异常,也可能被计入通过断言。这对于防止崩溃很有价值,但不应与功能实现率混为一谈。

更合适的指标应该拆成:

状态含义
NativeLinux 原生实现且语义基本一致
Equivalent使用 Linux 等价能力实现
Degraded可调用,但行为或功能明显弱化
Error boundary仅保证抛出明确错误
Not implemented未实现
Environment-dependent依赖桌面、扩展、Portal 或外部程序

目前仓库把“入口可调用”“明确报错”和“完整实现”混在一个总体断言数字中,容易产生宣传上的误导。


P1:Windows 专用功能不是“移植”,而是替换或占位

以下差异不会因为增加几个测试就自然消失:

COM

项目所谓的 COM 实际是 D-Bus 映射,不存在 Windows 的 IUnknown、IDispatch、SafeArray 或真实 COM vtable;ComObjArrayComObjQueryComObjConnect 等没有可运行的对应实现。(GitHub)

因此依赖 Excel、Word、Internet Explorer、WMI、Shell.Application 等 COM 自动化的 Windows AHK 脚本基本不能直接迁移。

注册表

RegRead/RegWrite 的底层实际上是单用户配置文件,HKCU、HKLM、HKCR、HKCC 被压到同一文件中,没有系统权限、注册表 hive 或 32/64 位视图语义。(GitHub)

这适合作为“让脚本保存设置”的兼容层,不适合被描述成 Windows 注册表兼容。

Win32 消息与 RunAs

OnMessageSendMessagePostMessage 不存在真实 Win32 消息投递;RunAs 可以保存凭据状态,但启动阶段仍会失败。(GitHub)

GUI 和窗口状态

GTK3 GUI 只覆盖部分控件和选项;有些属性接受参数但忽略。控件的 enabled、checked、style 等部分状态保存在本地 shadow map 中,外部程序改变后不一定读得回来。窗口样式、透明度和置顶也部分依赖 shadow 状态和 EWMH,不能保证外部窗口结果准确。(GitHub)

这些属于平台模型差异,应该在迁移工具中明确标注,而不是继续追求单一“内建函数实现数量”。


P1:原生 Wayland 的跨应用自动化范围仍然很窄

AT-SPI 当前主要实现:

  • ControlGetText
  • ControlSetText
  • ControlClick

并且端到端验证重点是 GTK3 应用。项目自己把任意窗口/属性枚举,以及 Qt/Electron 应用矩阵列为后续工作。(GitHub)

真实桌面自动化还需要覆盖:

  • GTK4;
  • Qt 5/Qt 6;
  • Chromium/Electron;
  • Firefox;
  • LibreOffice;
  • JetBrains IDE;
  • Java Swing/JavaFX;
  • Flatpak/Snap 沙箱应用;
  • 没有正确暴露 accessibility tree 的程序;
  • 自绘控件和游戏。

AT-SPI 也不是 Win32 Control API 的直接替代。程序是否启用无障碍接口、控件角色是否规范、应用是否运行在沙箱中,都会影响结果。


P1:Unicode 输入的剪贴板回退不适合敏感场景

在 GNOME/KWin 等缺乏 virtual-keyboard 协议的环境中,项目会采用:

  1. 临时修改剪贴板;
  2. 模拟 Ctrl+V
  3. 等目标读取;
  4. 恢复原剪贴板。

项目已经提供禁用开关并在首次使用时对密码管理器和敏感文本发出警告。(GitHub)

这个方案对普通文本扩展可以接受,但不能保证:

  • 剪贴板管理器不记录临时敏感内容;
  • 远程桌面或同步剪贴板不上传内容;
  • 目标应用一定读取成功;
  • 用户在事务过程中没有同时更改剪贴板;
  • 密码框接受粘贴;
  • 大文本粘贴期间脚本不被中断。

因此“SendText 支持 Unicode”和“以真实按键方式可靠发送 Unicode”应当在文档中区分。


P1:仓库状态和文档出现明显漂移

当前 README 仍写着:

  • 1134 个 doc-check;
  • 247 个 XWayland 测试;
  • TrayTipTraySetIcon 未实现或无托盘图标。

但当前兼容文档和 CHECK_REPORT 已经写成:

  • 1143 个 doc-check;
  • 252 个 XWayland 测试;
  • TrayTip 经通知服务实现;
  • TraySetIcon 经 StatusNotifierItem 实现。

8 月 23 日的最新提交也专门加入了 SNI 托盘注册场景。(GitHub)

甚至 CHECK_REPORT 一处仍把 TrayTip/TraySetIcon 列在“边界错误操作”中,另一处又描述它们已经实现。(GitHub)

这说明所谓的“机器校验数字防漂移”只验证了部分报告文件,没有让 README、能力矩阵、worklist 和 release notes 从同一个 feature manifest 自动生成。

建议建立一个唯一的机器可读清单,例如:

yaml
TraySetIcon: x11: equivalent gnome-wayland: equivalent kde-wayland: unverified implementation: status-notifier-item tests: - headless - gnome49-vm since: linux.16

README、文档表格和测试报告全部从该清单生成。


P1:发布版与开发分支差异较大

最新正式发布版是 v2.0.26-linux.15,发布于 8 月 20 日;但 8 月 23 日开发分支已经继续增加 evdev panic、inputd/remap、IBus、Flatpak、AT-SPI 应用矩阵、托盘 SNI 等大量场景和修复。(GitHub)

这意味着:

  • README 可能描述开发分支,而用户下载的是三天前的 release;
  • 某些“已经实现”的功能未必存在于最新发布包;
  • 快速迭代期间行为和配置接口仍可能变化;
  • 当前 release tag 不宜直接视为长期稳定版。

至少应该维护:

  • main 或稳定分支;
  • linux-port-next 开发分支;
  • release 对应的冻结文档;
  • 每个 release 的兼容性矩阵快照;
  • 明确的 breaking-change 和迁移说明。

P1:真实环境验证仍然不足

兼容矩阵重点覆盖 Ubuntu 24.04 的 Xvfb/sway/XWayland,以及 Ubuntu 25.10 的 GNOME 49 VM。Fedora、Debian、Arch、其他 GNOME 版本和更完整的 KDE 路径仍被列为计划项。(GitHub)

这对于 Linux 桌面项目远远不够,因为结果还会受以下因素影响:

  • Xorg 与 Wayland;
  • GNOME 45、46、47、48、49、50;
  • KDE Plasma 5/6;
  • Mutter、KWin、wlroots;
  • XDG Portal 后端版本;
  • Flatpak/Snap;
  • systemd-logind 和 seat;
  • 多键盘、多鼠标、蓝牙设备;
  • 多显示器、缩放和混合 DPI;
  • 输入法 IBus/Fcitx5;
  • 非英文布局;
  • NVIDIA 专有驱动和远程桌面。

当前 CI 成功能证明代码没有明显退化,但不能证明复杂真实桌面的可靠性。


P2:维护和社区风险较高

仓库目前由单一维护者维护,页面显示 0 fork、0 issue、0 pull request,尚未形成外部用户问题库、代码评审或多人维护结构。项目自己也承认“大规模社区验证仍然很年轻”。(GitHub)

这会带来:

  • bus factor 为 1;
  • 当前“0 issue”更可能代表缺少用户,而非没有缺陷;
  • 输入、权限和桌面协议相关代码缺少独立安全审查;
  • 发生桌面环境升级后,兼容性可能依赖维护者快速修复;
  • 对上游 AutoHotkey 的后续同步成本会不断增加。

建议的开发优先级

第一阶段:先把输入安全做正确

这是进入 beta 前的阻断项:

  1. 修复 evdev 设备 capability 识别。
  2. 把独占设备逻辑移到独立 ahk-inputd
  3. 完成 broker 身份验证、最小权限和 fail-open watchdog。
  4. 保证运行时或脚本崩溃不会锁死键鼠。
  5. 加入键盘、鼠标、触控板、媒体键、多个设备、热插拔测试。
  6. 明确区分 observer、exclusive hotkey 和 full remap 三种模式。
  7. 未满足安全条件时拒绝启用,而不是退化到半工作状态。

第二阶段:用同一事件流实现 Wayland 完整输入语义

需要依次补齐:

  • 透传与抑制;
  • key-up;
  • wildcard;
  • 左右修饰键;
  • custom combo;
  • remap;
  • repeat;
  • Hotstring;
  • InputHook;
  • SendLevel/InputLevel
  • 物理输入与自身注入事件去环。

当前 evdev 源码还明确表示左右修饰键在该路径中按合并掩码匹配,不能可靠区分 <^a>^a。(GitHub)

第三阶段:建立真实应用自动化矩阵

至少加入 GTK3、GTK4、Qt6、Electron、Firefox、LibreOffice 六类应用,在 X11、GNOME Wayland 和 KDE Wayland 上分别验证:

  • 查找窗口;
  • 枚举控件;
  • 读取/设置文本;
  • 点击;
  • 聚焦;
  • 选择列表项;
  • 菜单;
  • 等待窗口;
  • 应用关闭和重启;
  • 沙箱权限失败时的可诊断错误。

第四阶段:重做兼容性表达

不要再以“367 built-ins”和“1143/1143”作为主要完成度指标。

应该按实际场景发布:

  • X11 automation score;
  • GNOME Wayland hotkey score;
  • KDE Wayland score;
  • accessibility automation score;
  • Windows-script migration score;
  • security readiness;
  • production readiness。

每项附真实测试环境和已知限制。

第五阶段:进入生产前的工程治理

需要有:

  • 至少两名有合并权限的维护者;
  • issue 模板和公开 bug tracker;
  • SECURITY.md 和私密漏洞报告渠道;
  • fuzzing;
  • 输入 broker 威胁模型;
  • 可复现构建和签名包;
  • 稳定版维护周期;
  • 多发行版、多桌面硬件 CI;
  • release 分支和回滚机制。

使用建议

可以试用

Xorg/X11 或主要目标程序都运行于 XWayland 的个人环境中,用于:

  • 启动程序;
  • 基本全局快捷键;
  • 文本发送;
  • 文件和进程自动化;
  • 简单 GUI;
  • X11 窗口和控件操作。

建议固定具体 commit 或 release,不要直接追随每日开发分支。

可以实验,但不要作为关键基础设施

在 GNOME/KDE Wayland 中用于:

  • 少量基本全局快捷键;
  • 简单 Send
  • 对 GTK 可访问控件进行文本或点击操作。

需要避免密码、密钥等内容经过剪贴板回退,并暂时避免在主力桌面开启实验性的 evdev 独占路径。

暂不适合

  • 把大量 Windows AHK 脚本原样迁移;
  • Office COM 自动化;
  • 依赖 Windows 注册表、消息、窗口句柄和控件 ClassNN 的脚本;
  • 企业桌面统一分发;
  • 无人值守关键自动化;
  • 需要在所有 GNOME/KDE/wlroots 桌面上表现一致的产品;
  • 依赖 Hotstring/InputHook 的纯 Wayland 工作流。

最终判断:这是一个进展很快、X11 路线已经值得试用的技术预览,但还不是通用的 Linux AutoHotkey 正式替代品。当前最优先的问题不是继续增加“内建函数数量”,而是修复 evdev 输入设备处理、安全权限模型、原生 Wayland 捕获闭环,以及建立真实桌面和应用验证矩阵。

分享这个问答