0
有没有办法检测鼠标是否已经在X服务器上任何地方移动或发生过键盘事件?我需要对用户在X11输入设备上做任何事情做出反应。X11:检测一般鼠标和键盘事件
我只设法使用GTK在我自己的窗口上检测事件。
我感谢每一个信息(它不必是完整的代码,切入点将是一件好事够了!)
有没有办法检测鼠标是否已经在X服务器上任何地方移动或发生过键盘事件?我需要对用户在X11输入设备上做任何事情做出反应。X11:检测一般鼠标和键盘事件
我只设法使用GTK在我自己的窗口上检测事件。
我感谢每一个信息(它不必是完整的代码,切入点将是一件好事够了!)
是的,你可以使用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);
在你的事件队列,你现在可以寻找相应的事件。
哇,非常感谢!有没有办法让设备产生输入?'例如,当我只想拦截由XTEST创建的设备时? – Nidhoegger
@Nidhoegger使用'XGetEventData'从事件中获取数据并读取这些数据的扩展说明。我会假设你得到的信息(deviceid),是的,但没有看过它。我上面提到的工具unclutter-xfixes可以告诉你如何识别队列中的事件以及如何调用'XGetEventData'。之后不要忘记也调用'XFreeEventData'。 –