gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 10:20:29 33 4
gpt4 key购买 nike

所以昨天,我查看了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/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com