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

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

我正在寻找一种方法来捕获这个input,并在它碰到正常的键盘事件处理程序(并输出10位数的RFID代码到控制台)之前阻止/过滤它。

我当然必须专门捕捉这个设备,并保持真正的键盘input(或传递)。

我最初的想法是阻止UDEV中的设备(所以usbhid / event / kbd内核模块没有绑定到它),并写下我自己的这个设备的基本驱动程序 – 但我不知道从哪里开始,或者如果甚至会工作。

如果我写了一个事件filter模块,它可以与事件驱动程序一致并捕获(然后过滤)来自事件驱动程序的适当input,那么什么是好的(我不确定是否可以完成这样的事情) 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) 

Solutions Collecting From Web of "需要拦截HID键盘事件(然后阻止它们)"

所以我根据我在这里找到的那个帖子掀起了一个概念验证的应用程序

这正是我所需要的 – 尽管我会分享我的解决方案。

 #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; } 

您可以在事件设备上使用EVIOCGRAB ioctl来专门捕获它。

取消绑定需要一个“假”值参数,如下所示:

 result = ioctl(fevdev, EVIOCGRAB, 0);