c++ - xlib XNextEvent 检查一个键是否被按下

标签 c++ linux c++11 x11 xlib

我正在使用 xlib 获取键盘输入我想模拟窗口的 getAsynckeystate() 以检查是否按下了按钮我尝试使用计时器来修复结果但它仍然坏了。即使同时按下或释放其他键(现在不工作),如果按住“z”,该函数也应始终返回 true

代码如下

bool KeyboardState::keyPressed(Display* d, Window curFocus,int revert, Window root) {
XEvent ev;
XNextEvent(d, &ev);
clock_t startTime;
switch (ev.type) {
    case FocusOut:
        if (curFocus != root)
            XSelectInput(d, curFocus, 0);

        XGetInputFocus(d, &curFocus, &revert);
        printf("New focus is %d\n", (int) curFocus);

        if (curFocus == PointerRoot)
            curFocus = root;

        XSelectInput(d, curFocus, KeyReleaseMask | FocusChangeMask | KeyPressMask);
        break;

    case KeyPress:
        ks = XLookupKeysym(&(ev.xkey), 0);

        if (ks == XK_z) {

            keyState = true;
            startTime = clock();
        }
        break;
    case KeyRelease:
        if(ks == XK_z && startTime - clock() > 0){

        ks = XLookupKeysym(&(ev.xkey), 0);
            keyState = false;
        }
}
return keyState;
}

最佳答案

n.m 链接了以下被接受为答案的函数:

tronche.com/gui/x/xlib/input/XQueryKeymap.html

关于c++ - xlib XNextEvent 检查一个键是否被按下,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38683047/

相关文章:

c++ - 为什么字符串的 find 方法比我的单遍更快?

c++ - 离散事件仿真算法调试

linux - 如何通过 $@ 将表达式中带有空格的 sed 命令传递给 Bash 函数

c++ - 多态放置的东西的析构函数

c++ - 线路运算符(operator)新的段错误

android - 在不同操作系统之上使用编程语言

linux - 为什么 kmeans 在高规范的 Ubuntu 机器上这么慢而不是 Windows?

c++ - std::move 是否总是按预期工作?

c++ - 在函数中销毁局部变量是什么意思

c++ - 访问函数变体时出现 "Invalid conversion"错误