在(Ubuntu)Linux中捕获第二个键盘输入

13

我编写了一个从 USB 第二键盘(实际上是条形码扫描器)获取输入的程序。问题是,如果另一个窗口处于活动状态,数据会被输入到那里而不是我的程序中。有人能给我一些建议吗?

#include <stdio.h>
#include <string.h>

int main(int argc, char * argv[]){
   FILE * fp_in;
   char * data;
   fp_in = fopen("/dev/input/by-id/usb-04d9_1400-event-kbd","r");

   if(fp_in == NULL){
      fprintf(stderr,"Failed to open input by id\n");
   }

   fp_in = fopen("/dev/input/by-path/pci-0000:00:1d.1-usb-0:2:1.0-event-kbd","r");

   if(fp_in == NULL){
      fprintf(stderr,"Failed to open input by path\n");
      return 1;
   }

  while(1){
      fscanf(fp_in,data,"%s");
      fprintf(stderr,"%s",data);
  }
  return 0;
}

谢谢


如果我可以代表Confuzzled重新提出问题,那么问题是:

如何在Linux下编写一个程序,使其附加到一个输入设备上,例如一个条形码扫描仪,这样输入就不会发送到具有键盘焦点的程序中?


也许你应该询问一种编程方式来区分这些键盘? - Judge Maygarden
另外,您使用什么类型的设备来连接键盘和条码阅读器(USB、PS/2、串口等)? - Judge Maygarden
请阅读以下内容,了解为什么这不是一个问题:http://stackoverflow.com/faq - Kent Fredric
抱歉之前问题表述不清,请见谅。 - Confuzzled
4个回答

4
我曾经遇到同样的问题,我的解决方法是使用xinput来“浮动”该设备。在我这个案例中,xinput list显示(除其他外): HID Keyboard Device HID Keyboard Device id=13 [slave keyboard (3)] 这就是与条形码扫描器对应的设备。然后你可以在终端中简单地输入: xinput float 13 这样,从扫描器键入的按键将不再进入焦点窗口,但仍然可以从设备文件中读取。但是,您需要解码从文件中读取的事件以获取所需信息(条形码)。有关如何执行此操作,请参见 /dev/input/event*?格式的一些信息。
最后,要在没有root权限的情况下读取设备文件,只需为扫描器添加udev规则。对于我来说,这类似于: SUBSYSTEM=="input", ATTRS{idVendor}=="1d57", ATTRS{idProduct}=="001c" MODE="0644" 您的扫描仪的idVendor和idProduct可以通过插入扫描仪后检查dmesg的输出来找到。

2

这个问题已经有一段时间没有被提出了 :) 无论如何,我认为你应该使用linux输入设备子系统API。

这里提供了一个很好的介绍。


1

我将列出与您的任务相关的常见问题清单,虽然我没有答案,但至少可以解释一下为什么会出现问题。

  1. 键盘设备出于明显的安全原因,对它们进行了访问控制限制。如果任意应用程序在没有正确权限的情况下能够嗅探/挂钩键盘,那么可能会产生致命后果,即键盘记录器。

  2. 有时,当一个应用程序(在您的情况下是X)控制了输入设备,它会吞噬所有发送到它的字节。因此,即使您成功绕过权限问题,仍然存在另一个软件在您之前消耗数据流的问题。


1
如果我理解您的问题正确,那么可能会有一些问题与您想要做的内容相对应。
1) 为了从/dev文件夹中读取,您需要具有root权限。
2) (我不太确定)但我认为这些是特殊文件,因此您不能像读取普通文件那样读取它们。
假设您已解决了这两个问题,它仍然无法解决您的问题,因为X事件由X服务器处理,您可以将其视为同时读取同一文件。它是捕获这些事件并通过调用特定事件处理程序(如果有)来相应地处理它们的东西,在最上面活动窗口中的特定事件。所有窗口都与X服务器通信,告诉它是否键入了某些内容。因此,即使您打开了带有正在运行的程序的终端窗口,首先X服务器也必须告诉窗口有关按键,然后才会传递给在终端中运行的程序。
另一个执行类似工作的代码可以在此处找到。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接