2014-05-23 82 views
0

我知道这里有一些,但许多答案总是有很多buts,ifs,而且你不应该那样做。如何从X11监控键盘事件

我想要做的是有一个后台程序,可以从X11监视键盘事件。这是在嵌入式设备上,它将有一个主要的应用程序,基本上运行在像Kiosk模式。我们想要一个后台应用程序来管理一些事情,并且可能是后门挂钩。但这个应用程序通常不会有重点。

我无法使用主应用程序,因为如果主应用程序出现故障,或者要执行某些dev类型的功能以绕过主应用程序,它部分会出现故障保险。

我发现的最好的问题是几岁,所以我不知道它是如何最新的。这对于Windows来说非常简单。

X KeyPress/Release events capturing irrespective of Window in focus

+0

目前还不清楚,你想分配几个“热键”组合到后台应用程序(其中的每一个会做一个特定的操作或将其聚焦)或者您是否需要能够将长输入输入到后台应用程序中,同时还能将相同的输入传递给当前关注的任何内容?第一种情况可以通过使用XCB(xcb_grab_key)来实现,这是实现这些目标的常规方式,而第二种情况对我来说没有多大意义。 – resistor

回答

2

这样做是正确的方法是使用Xlib。使用这个库,你可以这样写代码:

从一个例子摘自:here

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

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

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

+0

不从事件设备读取消耗事件,我将不得不将它转发到X?此外,事件设备的变化,所以我宁愿不必管理搞清楚哪些是键盘(比事件设备GPIO键和i2c键盘......) – Kevin

+0

我想我只是找到了你要找的东西。尝试** xlib **(http://tronche.com/gui/x/xlib/)。特别节10 **活动**。 –

+0

编辑回答,显示使用xlib的解决方案。 –