-
Notifications
You must be signed in to change notification settings - Fork 870
Open
Labels
bugSomething isn't workingSomething isn't working
Description
描述 Bug
问题描述
启动 BongoCat 后再运行鸣潮(Wuthering Waves),猫咪完全无法响应键盘和鼠标输入。切换到窗口化 / 无边框窗口模式后问题依旧存在。相同环境下,原版 Bongo-Cat-Mver 能够正常捕获输入。
复现步骤
- 启动 BongoCat(v0.9.0)
- 启动鸣潮(全屏 / 窗口化 / 无边框窗口均尝试过)
- 在游戏内按下任意键或移动鼠标
预期行为: 猫咪响应键盘和鼠标操作
实际行为: 猫咪完全没有反应
环境信息
- 操作系统: Windows 11 Pro(10.0.22631)
- BongoCat 版本: v0.9.0
- 游戏: 鸣潮(Wuthering Waves)
- 游戏反作弊: 鸣潮使用了内核级反作弊
原因分析
通过对比 BongoCat 与 Bongo-Cat-Mver 的源码,发现两者使用了完全不同的输入捕获机制:
| BongoCat (Tauri) | Bongo-Cat-Mver (正常工作) | |
|---|---|---|
| 键盘 | rdev::listen() → SetWindowsHookEx 全局钩子 |
GetKeyState() 每帧轮询 |
| 鼠标 | rdev::listen() → SetWindowsHookEx 全局钩子 |
DirectInput (DISCL_NONEXCLUSIVE | DISCL_BACKGROUND) |
| 捕获方式 | 被动接收事件回调 | 主动轮询按键状态 |
BongoCat 当前在 src-tauri/src/core/device.rs 中通过 rdev::listen() 设置全局钩子(底层调用 Win32
SetWindowsHookEx)。鸣潮等带有内核级反作弊的游戏会主动阻止全局钩子注入,导致 rdev 的回调无法收到任何事件。
而 Bongo-Cat-Mver 使用 GetKeyState() 轮询方式读取键盘状态,使用 DirectInput
的后台非独占模式读取鼠标数据,这两种方式均不依赖全局钩子,因此不受反作弊影响。
建议的解决方向
在 Windows 平台上提供基于轮询的输入捕获作为替代方案:
- 键盘: 使用
GetAsyncKeyState()/GetKeyState()轮询(通过windowscrate 调用 Win32 API) - 鼠标: 使用 Raw Input API 或 DirectInput 的后台模式
可以保留 rdev 作为 macOS / Linux 的实现,仅在 Windows 平台切换到轮询方案。
// 伪代码示意
#[cfg(target_os = "windows")]
fn poll_keyboard() {
// 使用 GetAsyncKeyState() 轮询所有需要监听的虚拟键码
}
#[cfg(not(target_os = "windows"))]
fn listen_keyboard() {
// 保留现有的 rdev::listen() 方案
}相关代码
- 输入监听入口:
src-tauri/src/core/device.rs:60 - rdev 依赖:
src-tauri/Cargo.toml:41(使用kunkunsh/rdevfork)
重现步骤
No response
预期行为
No response
软件信息
{
"appName": "BongoCat",
"appVersion": "0.9.0",
"tauriVersion": "2.5.1",
"platform": "windows",
"platformArch": "x86",
"platformVersion": "10.0.22631"
}
附加信息
No response
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
bugSomething isn't workingSomething isn't working