Keyboard 使用xcb xtest生成按键

Keyboard 使用xcb xtest生成按键,keyboard,keypress,xcb,Keyboard,Keypress,Xcb,我只是想用XCB生成一个活动窗口的按键。 我有一些代码,我认为应该可以工作。 当我运行它时,似乎有大约1/10的机会,w键的动作就像被按住一样,直到我按下并释放w键,而其他9/10键完全没有发生任何事情。 代码如下: #include <stdio.h> #include <xcb/xcb.h> #include <xcb/xtest.h> int main() { xcb_connection_t *conn; conn = xcb_co

我只是想用XCB生成一个活动窗口的按键。 我有一些代码,我认为应该可以工作。 当我运行它时,似乎有大约1/10的机会,w键的动作就像被按住一样,直到我按下并释放w键,而其他9/10键完全没有发生任何事情。 代码如下:

#include <stdio.h>
#include <xcb/xcb.h>
#include <xcb/xtest.h>

int main() {
    xcb_connection_t *conn;

    conn = xcb_connect(NULL, NULL);
    if (xcb_connection_has_error(conn))
        puts("failed to connect\n");

    xcb_test_fake_input(conn, XCB_KEY_PRESS, 25, XCB_CURRENT_TIME, XCB_NONE, 0, 0, 0);

    xcb_flush(conn);
    xcb_disconnect(conn);
}
对你有用吗?我做错了什么

当我运行它时,似乎有大约1/10的机会,w键的动作就像被按住一样,直到我按下并释放w键

您的程序会生成按键,但不会释放按键。使用
XCB\u键\u释放
尝试另一个呼叫

而另外9/10则什么也没发生

我想这可以通过添加类似于
free(xcb_get_input_focus_reply(conn,xcb_get_input_focus,conn,NULL))的内容来解决xcb\u disconnect()
之前的code>应该可以解决此问题

我的理论是,您与X11服务器竞争。当
poll()
指示另一端挂起时,X11服务器不一定从连接中读取挂起的数据。因此,只要发送请求并断开连接,它就可能丢失

我提议的更改发送另一个请求并等待X11服务器的回复。这确保之前的一切都已经处理好了

gcc c.c -lxcb -lxcb-xtest