当前位置: 首页 > 面试题库 >

需要拦截HID键盘事件(然后阻止它们)

黎玺
2023-03-14
问题内容

我有一个注册为HID设备的RFID USB设备(一个或多个USB键盘)。

我正在寻找一种捕获此输入的方法,并在它击中普通键盘事件处理程序之前对其进行阻止/过滤(并将10位RFID代码输出到控制台)。

我当然必须专门捕获该设备,而不必留下真正的键盘输入(或传递它)。

我最初的想法是在UDEV中阻止该设备(因此usbhid / event / kbd内核模块未绑定到该设备)并为该设备编写我自己的基本驱动程序-
但我不知道从哪里开始,或者是否甚至会工作。

很棒(而且我不确定是否可以完成这样的事情)-是如果我编写了一个事件过滤器模块,该模块可以与事件驱动程序串联,并捕获(然后过滤)来自RFID单元,但让其他所有东西都通过。我想这样的模块不需要太多的代码,并且将是最实用的。

帮帮我?

[编辑:我应该补充一点,未安装Xorg-仅限控制台]

cat /proc/bus/input:
  I: Bus=0003 Vendor=0419 Product=0912 Version=0100
  N: Name="NewRoad Sem. NewRoad System PS2 Interface"
  P: Phys=usb-0000:00:1d.3-2/input0
  S: Sysfs=/devices/pci0000:00/0000:00:1d.3/usb5/5-2/5-2:1.0/input/input20
  U: Uniq=
  H: Handlers=sysrq kbd mouse0 event3
  B: PROP=0
  B: EV=120017
  B: KEY=70000 0 0 e080ffdf01cfffff fffffffffffffffe
  B: REL=103
  B: MSC=10
  B: LED=1f

更多信息:

lsusb -d 0419:0912 -v
Bus 005 Device 019: ID 0419:0912 Samsung Info. Systems America, Inc.
Device Descriptor:
  bLength                18
  bDescriptorType         1
  bcdUSB               1.00
  bDeviceClass            0 (Defined at Interface level)
  bDeviceSubClass         0
  bDeviceProtocol         0
  bMaxPacketSize0         8
  idVendor           0x0419 Samsung Info. Systems America, Inc.
  idProduct          0x0912
  bcdDevice            0.01
  iManufacturer           1 NewRoad Sem.
  iProduct                2 NewRoad System PS2 Interface
  iSerial                 0
  bNumConfigurations      1
  Configuration Descriptor:
    bLength                 9
    bDescriptorType         2
    wTotalLength           34
    bNumInterfaces          1
    bConfigurationValue     1
    iConfiguration          4
    bmAttributes         0xa0
      (Bus Powered)
      Remote Wakeup
    MaxPower              100mA
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        0
      bAlternateSetting       0
      bNumEndpoints           1
      bInterfaceClass         3 Human Interface Device
      bInterfaceSubClass      1 Boot Interface Subclass
      bInterfaceProtocol      1 Keyboard
      iInterface              5
        HID Device Descriptor:
          bLength                 9
          bDescriptorType        33
          bcdHID               1.00
          bCountryCode            0 Not supported
          bNumDescriptors         1
          bDescriptorType        34 Report
          wDescriptorLength     119
         Report Descriptors:
           ** UNAVAILABLE **
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x81  EP 1 IN
        bmAttributes            3
          Transfer Type            Interrupt
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0008  1x 8 bytes
        bInterval              10
Device Status:     0x0000
  (Bus Powered)

问题答案:

因此,根据我在此处找到的帖子,我整理了一个概念验证应用

它确实满足了我的要求-即使我仍然会分享我的解决方案。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <fcntl.h>
#include <dirent.h>
#include <linux/input.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/select.h>
#include <sys/time.h>
#include <termios.h>
#include <signal.h>

int main(int argc, char* argv[])
{
    struct input_event ev[64];
    int fevdev = -1;
    int result = 0;
    int size = sizeof(struct input_event);
    int rd;
    int value;
    char name[256] = "Unknown";
    char *device = "/dev/input/event3";


    fevdev = open(device, O_RDONLY);
    if (fevdev == -1) {
        printf("Failed to open event device.\n");
        exit(1);
    }

    result = ioctl(fevdev, EVIOCGNAME(sizeof(name)), name);
    printf ("Reading From : %s (%s)\n", device, name);

    printf("Getting exclusive access: ");
    result = ioctl(fevdev, EVIOCGRAB, 1);
    printf("%s\n", (result == 0) ? "SUCCESS" : "FAILURE");

    while (1)
    {
        if ((rd = read(fevdev, ev, size * 64)) < size) {
            break;
        }

        value = ev[0].value;

        if (value != ' ' && ev[1].value == 1 && ev[1].type == 1) {
            printf ("Code[%d]\n", (ev[1].code));
        }
    }

    printf("Exiting.\n");
    result = ioctl(fevdev, EVIOCGRAB, 1);
    close(fevdev);
    return 0;
}


 类似资料:
  • 我试图通过事件总线发送数据,当从客户端接到呼叫并响应回客户端。 一切正常,直到我在事件总线上添加拦截器... 以下是代码:- 还有一个疑问是,当我从IDE停止应用程序时,不会调用stop方法,但是如果我从另一个正常工作的垂直程序中取消部署这个垂直程序。

  • 键盘事件的种类 键盘事件由用户击打键盘触发,主要有keydown、keypress、keyup三个事件,它们都继承了KeyboardEvent接口。 keydown:按下键盘时触发。 keypress:按下有值的键时触发,即按下 Ctrl、Alt、Shift、Meta 这样无值的键,这个事件不会触发。对于有值的键,按下时先触发keydown事件,再触发这个事件。 keyup:松开键盘时触发该事件。

  • 输入框接口 用于弹起输入框,供用户输入文字。可以通过注册监听函数进行监听用户的输入,监听完毕请及时调用注销方法,取消监听。 BK.UI.showKeyboard(Object) 显示输入框,弹出键盘 手Q版本:7.6.5 函数参数Object: 属性名 类型 是否必填 说明 deaultText string 否 默认要展示的字符串 complete Function 否 接口调用完成回调 示例:

  • 问题内容: 在我的系统中编辑页面时,用户可能会决定导航到另一个网站,这样做可能会丢失他们尚未保存的所有编辑。 我想拦截任何尝试转到另一个页面的尝试,并提示用户确保他们希望这样做,因为他们可能会丢失当前的工作。 Gmail的执行方式与此非常相似。例如,撰写一封新电子邮件,开始在邮件正文中键入内容,然后在地址栏中输入新位置(例如twitter.com等)。它将提示您“确定吗?” 想法如何复制这个?我的

  • 对于桌面游戏,一般需要通过键盘做一些游戏内的控制,这时你就需要监听键盘事件。Cocos2d-x 支持键盘事件,就像上节介绍的触摸事件一样。 创建键盘事件监听器: // creating a keyboard event listener auto listener = EventListenerKeyboard::create(); listener->onKeyPressed = CC_CALL

  • 与响应鼠标事件相比,响应 Canvas 键盘事件没有那么直接,因为 Canvas 本身并不支持键盘事件的响应。我们需要耍一点小手段——在 Canvas 上添加一个支持键盘事件的其他对象。 本节的例程将在 7.2 节例程的基础上添加键盘响应事件。 html 部分变更的代码如下: //canvas_mk_event.html <canvas tabindex="0"></canvas>