You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Linux环境下如何用C#实现全局键盘钩子捕获USB遥控器输入

可行实现方案推荐

方案一:基于Libevdev封装实现(最稳定,适配需求)

libevdev是Linux原生的输入设备处理库,专门用于读写/dev/input下的输入设备事件,完美解决你提到的两个核心问题:

  • 可以通过EVIOCGRAB ioctl实现设备独占访问,拦截后其他程序不会收到该遥控器的输入事件
  • 无需root权限,仅需配置udev规则或把当前用户加入input用户组即可访问

实现步骤

  1. 安装系统依赖:
sudo apt install libevdev-dev
  1. 你的C#项目安装NuGet包LibevdevSharp
  2. 核心代码示例:
using LibevdevSharp;
using LibevdevSharp.Events;

// 替换为你遥控器的实际VID、PID,可通过lsusb命令查看
const ushort TargetVid = 0xXXXX;
const ushort TargetPid = 0xXXXX;

// 枚举所有输入设备找到目标遥控器
var devicePath = Directory.EnumerateFiles("/dev/input", "event*")
    .FirstOrDefault(path => {
        try {
            using var dev = new EvdevDevice(path);
            return dev.IdVendor == TargetVid && dev.IdProduct == TargetPid;
        } catch {
            return false;
        }
    });

if (devicePath == null) {
    Console.WriteLine("未找到目标遥控器");
    return;
}

using var remoteDev = new EvdevDevice(devicePath);
// 独占设备,其他程序无法接收输入
remoteDev.Grab();

// 监听输入事件
while (true) {
    var ev = remoteDev.NextEvent();
    if (ev.Type == EventType.EV_KEY && ev.Value == 1) { // 按键按下事件
        Console.WriteLine($"按下按键:{(Key)ev.Code}");
        // 在这里触发你程序的对应逻辑
    }
}

权限配置(无需root)

如果不想以root身份运行程序,执行以下任意一种配置即可:

  • 将当前用户加入input用户组,重启后生效:
sudo usermod -aG input $USER
  • 编写专属udev规则,仅开放该遥控器的访问权限:
    在/etc/udev/rules.d/99-sg-remote.rules中添加如下内容(替换为实际VID PID):
SUBSYSTEM=="input", ATTRS{idVendor}=="XXXX", ATTRS{idProduct}=="XXXX", MODE="0664", GROUP="input"

重载udev规则后重新插入遥控器即可生效:

sudo udevadm control --reload-rules && sudo udevadm trigger

方案二:GUI程序输入源过滤(仅适用带界面的程序)

如果你的程序是GUI应用(基于Avalonia/GTK#/MAUI等框架开发),可以直接在窗口的输入事件回调中判断输入设备来源,仅处理该遥控器的输入并拦截事件冒泡,无需访问底层输入设备,权限要求最低。

方案三:HIDSharp极简实现

如果更倾向用HIDSharp,核心逻辑如下:枚举所有HID设备匹配VID/PID和对应接口,打开设备后异步读HID报告即可,不需要复杂的API调用,几行代码即可实现基础读取逻辑。


内容的提问来源于stack exchange,提问作者GrantByrne

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 20:57:03