我只是尝试用XCB生成一个活动窗口的按键。我有一些我认为应该有效的代码。当我运行w键时,似乎有1/10的机会,直到我按下和释放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对你有用吗?我做错了什么?
发布于 2020-02-10 10:02:28
,当我运行w键时,似乎有1/10的机会,直到我按下和释放w之后,w键才会被按住,
您的程序生成一个按键,但没有密钥释放。再用XCB_KEY_RELEASE打个电话。
和其他9/10没有发生任何事情。
我猜想,在调用free(xcb_get_input_focus_reply(conn, xcb_get_input_focus(conn), NULL));之前添加类似xcb_disconnect()的内容就可以解决这个问题。
我的理论是,您可以使用X11服务器进行竞争。当X11服务器指示另一端挂起时,poll()服务器不一定从连接读取挂起的数据。因此,只要发送请求并断开连接,它就会丢失。
我提议的更改会发送另一个请求,并等待来自X11服务器的答复。这就确保了之前的一切都已经得到了处理。
https://stackoverflow.com/questions/60139964
复制相似问题