c++ - 使用 Xinput2 获取双 RawKeyPress 事件

标签 c++ linux x11 xlib

所以昨天,我查看了the xinput source code为了模仿那里正在做的事情,所以我可以为我正在做的项目制作一个击键监听器。

在检查了源代码,尤其是 test_xi2.c 之后,我想到了这个。

#include <iostream>
#include <X11/Xlib.h>
#include <X11/extensions/XInput2.h>
#include <X11/Xutil.h>
#include <stdio.h>
#include <stdlib.h>


int main() {
    Display* display = XOpenDisplay(NULL);
    Window win;
    win = DefaultRootWindow(display);


    XIEventMask* m = new XIEventMask;

    m->deviceid = XIAllDevices;
    m->mask_len = XIMaskLen(XI_LASTEVENT);
    m->mask = (unsigned char*)calloc(m->mask_len, sizeof(char));

    XISetMask(m->mask, XI_RawKeyPress);
    XISetMask(m->mask, XI_RawKeyRelease);

    XISelectEvents(display, win, m, 1);

    XSync(display, False);

    while(true)
        {
            XEvent ev;
            XGenericEventCookie *cookie = (XGenericEventCookie*)&ev.xcookie;
            XNextEvent(display, (XEvent*)&ev);

            if (XGetEventData(display, cookie) && cookie->type == GenericEvent) {
                switch (cookie->evtype) {
                case XI_RawKeyPress: std::cout << "keystroke" << std::endl; break;
                }
            }


            XFreeEventData(display, cookie);
        }

    XDestroyWindow(display, win);

    return 0;
}

您可以通过执行 g++ main.cpp -lX11 -lXi 来编译它。

因此,如果您将它与原始来源进行比较,您会看到我唯一没有做的事情,除了监听目前对我无用的所有其他事件类型之外,是检查是否 cookie->extension == xi_opcode ( line 431 of test_xi2.c )。经过一番研究,我得出的结论是,实际上没有必要检查是否满足这个条件。 xi_opcode 结果是一个扩展操作码,使用 XQueryExtension here 查询.我检查了我的机器,扩展名似乎总是 131,所以它不像一半的 RawKeyPress 事件有一个扩展名而另一半有另一个扩展名。

我真的不知道还能发生什么。

最佳答案

似乎 XIAllDevices 还捕获虚拟“额外”设备,在本例中包括第二个键盘,这意味着您将获得所有键盘事件 2 次。

尝试使用 XIAllMasterDevices 将所有这些整合到一个“键盘”中。

关于c++ - 使用 Xinput2 获取双 RawKeyPress 事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44095001/

相关文章:

c++ - std::dynamic_pointer_cast 成功调用非初始化类

c - UDP 接收超时选项 linux c

java - JavaFX:OS停靠栏中的程序标题(例如,Ubuntu 19.10)

c++ - 如何将返回函数中的值作为另一个函数的参数传递,在其中使用它然后适本地调用它 C++?

c++ - 如果目标应用程序在 C++ 中崩溃,则无法使用 LVM_GETITEMTEXT

c - POSIX 线程与并行性

linux - NOHZ=ON 如何影响 Linux 内核中的 do_timer()?

c - 如何在 x11 中的根窗口上写入?

unix - ffmpeg 从子窗口捕获输出

c++ - 我应该如何进行深度独立混合?