Tauri 和 enigo 你们不许再崩溃啦!

Rust 新手 轻喷

最近闲暇时间一直在开发Auto Engine这个项目(具体名字还没定,就先叫这个吧),倒也踩了不少坑,尤其是Enigo这个crate,这小子还真不省心。

Auto Engine是一个桌面自动化的工具,自然而然就包含了模拟键鼠的操作,基于Tauri开发,那自然而然就用到了Enigo这个crate。

结论:enigo这个库在不同OS上有一些细节需要关注

engio 这小子给我埋的第一个坑就是:

MacOS下的键盘模拟会崩溃

虽然在Mac上开发,但因为有个具体的使用场景是Windows的,所以测试都放在了Win上,就理所应当得以为Mac上也能正常执行。更何况一开始在Mac上单独试用enigo的时候也没有发现问题。

但当我兴冲冲地编译完第一个Mac版的Auto Engine,点击运行后

咔!的一下!崩溃了,而且没有任何日志输出😭

接着一步步定位,最终定位到了这段代码上

rust 复制代码
    pub fn keyboard(&self, key: Key, direction: enigo::Direction) -> Result<(), String> {
        let mut enigo = Enigo::new(&Settings::default()).unwrap();
        
        enigo
            .key(key, direction)
            .map_err(|err| format!("Failed to click: {err}"))?;
        Ok(())
    }

官方example ↓

这应该是一个非常非常标准使用 enigo 的代码(我觉得),几乎和官方的example中的代码没啥区别~吧?主要是这玩意儿在WIndows上跑一点问题都没有。

我开始请求网友的帮助,关键词:macosTauriEnigoCrush

好消息: 找到两个相关的Issue,一个是来自enigo这个仓库,另一个是来自tauri这个仓库

坏消息: 两个Issue都是Open的状态

(我先哭会儿🥹)

一看到都是Open的状态,看都懒得看了,大致浏览了一下,好像是跟 并发多线程 有关系,不过两边都不知道怎么去解决这个问题。心如死灰,那段时间我甚至打算放弃Mac平台的编译了。

但是人嘛终究是贱,得不到的就更加爱~,对于自己解决不掉的问题,空的时候总归会回过头看看它还在不在那;就像跟你分手的前任一样,偷偷摸摸看看她朋友圈最近过得怎么样🤡

虽然很小丑,但是!你别说!你还真别说!

当我再次翻看tauri的这条issue的时候,你猜我发现了什么!

(我先帖一下这Issue: github.com/tauri-apps/...

这位名字叫做inomata137的老哥,还真给了我个偏方,把前任问题解决了🤓,我tm不是小丑了哈哈!

他首先甩出了两个会崩溃的案例代码,然后注意看他的第三段代码,他直接就是一个 run_on_main_thread 让enigo这小子 直接就是说,在tauri的 主线程 中执行~

无敌

这波非常的无敌

相关推荐
k4m7v2pz32 分钟前
Bevy 0.14.2 玩家精灵不渲染(只有背景在动)排查全记录
macos·rust·bevy
老王生涯2 小时前
rust开发环境配置-Windows & GNU
开发语言·windows·rust
Yeauty2 小时前
自建 HLS 第一问:fMP4 还是 TS?用 Rust 在进程内把两种都跑出来
开发语言·后端·rust
Flynt4 小时前
我用Biome替换ESLint+Prettier在项目上踩了不少坑
rust·eslint·前端工程化
Yeauty4 小时前
2026 年在 Rust 里处理音视频,该走哪条路?
rust·ffmpeg·音视频·视频
TDengine (老段)1 天前
TDengine Go 与 Rust 连接器 — 高性能异步访问
大数据·数据库·物联网·golang·rust·时序数据库·tdengine
魔力女仆1 天前
【RUST AI】把 TTS 搬进浏览器:kokoroi-rs 的 WASM 实践
人工智能·rust·wasm
米尔的可达鸭1 天前
UDP 通信深度实验:从 Windows FastPath 到 ICMP 端口不可达的完整排查
windows·websocket·网络协议·rust·udp·wireshark·tcpdump
jinshw1 天前
自己实现GIS配图软件(二)
前端·后端·rust
行走的陀螺仪1 天前
从 nvm 到 fnm:更快、更省心的 Node.js 版本管理器迁移指南
rust·node.js·nvm·fnm