【问题标题】:X11: Detect general Mouse and Keyboard eventsX11:检测一般鼠标和键盘事件
【发布时间】:2016-09-16 04:55:02
【问题描述】:

有没有办法检测鼠标是否在 X 服务器上的任何地方移动或发生了键盘事件?我需要对用户使用 X11 输入设备进行任何操作做出反应。

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

感谢所有信息(不必是完整的代码,入口点就足够了!)

【问题讨论】:

    标签: c linux keyboard mouse x11


    【解决方案1】:

    是的,您可以使用 Xinput2 扩展来执行此操作。可以在here (unclutter-xfixes) 找到一个完整但相当小的工具,它可以为光标事件执行此操作。作为免责声明,我是该工具的作者。

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

    使用 XInput2 有很多好处:

    • 无需不断轮询位置(资源高效)
    • 不会干扰/破坏应用程序,例如在所有窗口上选择鼠标事件。

    不容易使用 Xinput2 得到的是确切的位置(但你可以在需要时查询它),但我的理解是你反正不需要它。 p>

    加载扩展程序后,我不会在此处显示,您可以像这样选择所有事件:

    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 使用XGetEventData 从事件中获取数据并阅读该数据含义的扩展规范。我会假设你得到了信息(deviceid),是的,但还没有看过它。我上面提到的工具 unclutter-xfixes 可以向您展示如何识别队列中的事件以及如何调用XGetEventData。之后别忘了也致电XFreeEventData
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-13
    • 1970-01-01
    • 1970-01-01
    • 2013-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多