【问题标题】:How to monitor keyboard events from X11如何从 X11 监控键盘事件
【发布时间】:2014-05-23 19:12:28
【问题描述】:

我知道其中有一些,但很多答案总是有很多但是,如果,你不应该那样做。

我想要做的是有一个后台程序可以监控来自X11 的键盘事件。这是在嵌入式设备上,它将有一个基本上以类似信息亭模式运行的主应用程序。我们希望有一个管理一些事情的后台应用程序,可能还有一个后门挂钩。但是这个应用程序一般不会有焦点。

我不能使用主应用程序,因为如果主应用程序发生故障,它的一部分是为了故障保护,或者做一些开发类型的事情来绕过主应用程序。

我发现的最好的问题是几年前的问题,所以我不确定它是最新的。这在 Windows 上非常容易做到。

X KeyPress/Release events capturing irrespective of Window in focus

【问题讨论】:

  • 不清楚,您是否尝试为后台应用程序分配一些“热键”组合(每个组合都会执行特定操作或使其成为焦点)还是需要能够在后台应用程序中输入长输入,同时将相同的输入传递给当前关注的任何内容?第一种情况可以使用 XCB (xcb_grab_key) 来实现,这是实现此类目标的正常方式,而第二种情况对我来说没有多大意义。

标签: linux embedded


【解决方案1】:

正确的做法是使用Xlib。使用这个库,您可以编写如下代码:

while (1)  {
  XNextEvent(dis, &report);
  switch  (report.type) {

  case KeyPress:
      if (XLookupKeysym(&report.xkey, 0) == XK_space)  {
          fprintf (stdout, "The space bar was pressed.\n");
      }
      break;
    }
}

/*This event loop is rather simple. It only checks for an expose event. XNextEvent waits for an event to occur. You can use other methods to get events, which are documented in the manual page for XNextEvent.*/

/*Now you will learn how to check if an event is a certain key being pressed. The first step is to put case KeyPress: in your switch for report.type. Place it in a similar manner as case Expose.*/

您还可以在映射到键盘的特殊设备文件上使用pollselect。在我的情况下是/dev/input/event1

如果您对映射到键盘的特殊文件有疑问,请阅读文件/var/log/Xorg.0.log(搜索单词keyboard)。

这里有另一个感兴趣的链接:Linux keyboard event capturing /dev/inputX

【讨论】:

  • 不从事件设备读取事件消耗事件,我将不得不将其转发给 X?事件设备也发生了变化,所以我不想管理找出哪些是键盘(不仅仅是事件设备的 GPIO 键和 i2c 键盘......)
  • 我想我刚刚找到了你要找的东西。试试 xlib (tronche.com/gui/x/xlib)。专业第 10 节 事件.
  • 嗯。我认为我不会找到更新的方法。这种方式似乎根本不起作用,我想我需要一个窗口来让它按照我提供的链接的指定工作。
  • 好吧,前段时间我使用 PlayStation 2 操纵杆 (USB) 来控制指针,我得到了一些不错的结果(没有窗口允许,只是连接到全局屏幕)。我将搜索我的遗留代码,看看是否能找到代码。
  • 太好了,我花了一些时间再次查看事件。关于如何从进程中读取事件,我可能是错误的。 Evtest 似乎没有消耗该事件。我在某处读到您需要传递事件,但事实并非如此。而且我在 evtest 代码中四处寻找,它绝对看起来不像将事件传递给 X。而且 evtest 似乎与 X 完美配合。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-15
  • 1970-01-01
  • 2023-03-28
  • 2015-08-14
  • 1970-01-01
相关资源
最近更新 更多