2016-05-19 94 views
0

有没有办法检测鼠标是否已经在X服务器上任何地方移动或发生过键盘事件?我需要对用户在X11输入设备上做任何事情做出反应。X11:检测一般鼠标和键盘事件

我只设法使用GTK在我自己的窗口上检测事件。

我感谢每一个信息(它不必是完整的代码,切入点将是一件好事够了!)

回答

1

是的,你可以使用Xinput2扩展做到这一点。一个完整但相当小的工具可以为光标事件做到这一点,可以在here (unclutter-xfixes)找到。作为免责声明,我是该工具的作者。

教程形式的另一个很好的资源可以找到here

使用XInput2有多方面的好处:

  • 无需不断查询位置(资源节约型)
  • 不能与/断应用,如在将所有窗口选择鼠标事件的干扰。

什么你做使用容易不Xinput2得到是确切位置(但是当你需要它,你可以查询),但我的理解是,你不需要也无妨。

一旦你加载的扩展,我不会在这里显示,您可以选择这样的所有事件:

XIEventMask masks[1]; 
unsigned char mask[(XI_LASTEVENT + 7)/8]; 

memset(mask, 0, sizeof(mask)); 
XISetMask(mask, XI_RawMotion); 
XISetMask(mask, XI_RawButtonPress); 
XISetMask(mask, XI_RawKeyPress); 

masks[0].deviceid = XIAllMasterDevices; 
masks[0].mask_len = sizeof(mask); 
masks[0].mask = mask; 

XISelectEvents(display, DefaultRootWindow(display), masks, 1); 
XFlush(display); 

在你的事件队列,你现在可以寻找相应的事件。

+0

哇,非常感谢!有没有办法让设备产生输入?'例如,当我只想拦截由XTEST创建的设备时? – Nidhoegger

+0

@Nidhoegger使用'XGetEventData'从事件中获取数据并读取这些数据的扩展说明。我会假设你得到的信息(deviceid),是的,但没有看过它。我上面提到的工具unclutter-xfixes可以告诉你如何识别队列中的事件以及如何调用'XGetEventData'。之后不要忘记也调用'XFreeEventData'。 –