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 下编写一个将自身附加到输入设备(在本例中为条形码扫描仪)的程序,以便输入不会转到具有键盘焦点的程序?

4

4 回答 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插入扫描仪后的输出来找到。

于 2014-02-17T01:49:04.483 回答
2

自从提出这个问题以来已经有一段时间了 :) 无论如何,我认为您应该做的是使用 linux 输入设备子系统 API。

http://www.linuxjournal.com/article/6429这里有一个很好的介绍。

于 2010-01-12T13:01:59.293 回答
1

我将从围绕您的任务的常见问题列表开始,我没有答案,但我至少可以提供一些关于您遇到问题的原因

  1. 出于明显的安全原因,键盘设备对其具有访问控制限制。出于显而易见的原因,如果任意应用程序可以在未经正确许可的情况下嗅探/挂钩键盘,则可能会产生致命后果,AKA:键盘记录器。

  2. 有时,当一个应用程序(在您的情况下为 X )获得了输入设备的控制权时,它会吃掉所有发送给它的字节。因此,如果您设法解决了权限问题,您仍然会遇到一些其他软件正在使用您之前的数据流的问题。

于 2008-11-12T23:58:20.910 回答
1

如果我正确理解了您的问题,则可能存在与您想要做的事情相对应的一些问题。

1) 为了从 /dev 文件夹中的这些文件中读取,您需要具有 root 权限。

2)(我对此不太确定)但我相信这些是特殊文件,因此您无法像普通文件一样阅读它们。

假设你解决了这两个问题,它仍然不能解决你的问题,因为 X 事件是由 X 服务器处理的,你可以认为它是同时读取同一个文件。它是捕获这些事件并通过调用相关事件处理程序(如果有)为最顶部活动窗口中的特定事件相应地处理它们的事件。所有的窗口都与 X 服务器对话,它会告诉您是否输入了某些内容。因此,即使您打开了一个正在运行程序的终端窗口,X 服务器首先必须告诉窗口有关按键的信息,然后将这些按键传递给终端中运行的程序。

可以在此处找到另一个执行类似工作的代码。

于 2011-10-23T16:14:06.697 回答