使用 xcb xtest 生成按键

Generate keypress with xcb xtest

我只是想用 XCB 为活动的 window 生成一个按键。 我有一些我认为应该有效的代码。 当我 运行 时,似乎有大约 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);
}

编译:

gcc c.c -lxcb -lxcb-xtest

对你有用吗?我做错了什么?

There's seems to be about a 1/10 chance when I run it that the w key acts like it's held down until I press and release w,

您的程序生成按键按下,但没有按键释放。用 XCB_KEY_RELEASE.

尝试另一个电话

and the other 9/10 nothing happens at all.

猜测 这可以通过在调用 xcb_disconnect() 之前添加类似 free(xcb_get_input_focus_reply(conn, xcb_get_input_focus(conn), NULL)); 的内容来解决。

我的理论是您与 X11 服务器赛跑。当 poll() 表明另一端挂断时,X11 服务器不一定会从连接中读取未决数据。因此,仅通过发送您的请求并断开连接,它可能会丢失。

我提议的更改发送另一个请求并等待来自 X11 服务器的回复。这确保之前的所有内容都已处理。