使用 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 服务器的回复。这确保之前的所有内容都已处理。
我只是想用 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 服务器的回复。这确保之前的所有内容都已处理。