【问题标题】:Generate keypress with xcb xtest使用 xcb xtest 生成按键
【发布时间】:2020-02-09 18:33:27
【问题描述】:

我只是想用 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);
}

编译:

gcc c.c -lxcb -lxcb-xtest

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

【问题讨论】:

    标签: keyboard keypress xcb


    【解决方案1】:

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

    您的程序生成一个按键,但没有按键释放。尝试使用 XCB_KEY_RELEASE 再次拨打电话。

    和其他 9/10 什么都没有发生。

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

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

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

    【讨论】:

      猜你喜欢
      • 2014-05-26
      • 2017-11-02
      • 2013-10-22
      • 2013-09-12
      • 1970-01-01
      • 1970-01-01
      • 2015-10-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多