Генерация нажатия клавиш с помощью xcb xtest - PullRequest
0 голосов
/ 09 февраля 2020

Я просто пытаюсь сгенерировать нажатие клавиши в активном окне с помощью XCB. У меня есть код, который, я думаю, должен работать. Похоже, что когда я запускаю его, вероятность того, что клавиша w будет удерживаться, пока я не нажму и не отпущу клавишу w, составляет около 1/10, а в остальных 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);
}

compile:

gcc c.c -lxcb -lxcb-xtest

Это работает для вас? Что я делаю не так?

1 Ответ

1 голос
/ 10 февраля 2020

Вероятность того, что при нажатии клавиши 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. Это гарантирует, что все до этого уже было обработано.

...