Skip to content

[Bug] 运行鸣潮等游戏时,BongoCat 无法捕获键盘和鼠标输入 #858

@JuyaoHuang

Description

@JuyaoHuang

描述 Bug

问题描述

启动 BongoCat 后再运行鸣潮(Wuthering Waves),猫咪完全无法响应键盘和鼠标输入。切换到窗口化 / 无边框窗口模式后问题依旧存在。相同环境下,原版 Bongo-Cat-Mver 能够正常捕获输入。

复现步骤

  1. 启动 BongoCat(v0.9.0)
  2. 启动鸣潮(全屏 / 窗口化 / 无边框窗口均尝试过)
  3. 在游戏内按下任意键或移动鼠标

预期行为: 猫咪响应键盘和鼠标操作
实际行为: 猫咪完全没有反应

环境信息

  • 操作系统: 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() 轮询(通过 windows crate 调用 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/rdev fork)

重现步骤

No response

预期行为

No response

软件信息

{
  "appName": "BongoCat",
  "appVersion": "0.9.0",
  "tauriVersion": "2.5.1",
  "platform": "windows",
  "platformArch": "x86",
  "platformVersion": "10.0.22631"
}

附加信息

No response

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions