XTestFakeKeyEvent вызовы проглатываются - PullRequest
0 голосов
/ 04 июля 2018

Я пытаюсь подменить нажатия клавиш; если быть более точным: я повторяю количество нажатий клавиш, которые все должны отправляться в определенное время - иногда несколько одновременно (или, по крайней мере, как близко друг к другу) насколько это возможно).

Реализуя это с помощью XTestFakeKeyEvent, я столкнулся с проблемой. Хотя то, что я написал, в основном работает так, как задумано, и отправляет события в нужное время, иногда некоторые из них не работают. XTestFakeKeyEvent никогда не возвращает ноль (что будет означать сбой), но эти события, кажется, никогда не достигают приложения, в которое я пытаюсь их отправить. Я подозреваю, что это может быть связано с тем, что частота вызовов слишком высока (иногда 100+ / сек), так как кажется, что она более подвержена ошибкам при большом количестве нажатий клавиш в секунду.

Небольшая программа для иллюстрации того, что я делаю, неполная и без проверок на ошибки для краткости:

// #includes ...

struct action {
    int time; // Time where this should be executed.
    int down; // Keydown or keyup?
    int code; // The VK to simulate the event for.
};

Display *display;

int nactions;           // actions array length.
struct action *actions; // Array of actions we'll want to "execute".

int main(void)
{
    display = XOpenDisplay(NULL);

    nactions = get_actions(&actions);

    int cur_time;
    int cur_i = 0;
    struct action *cur_action;

    // While there's still actions to execute.
    while (cur_i < nactions) {
        cur_time = get_time();
        cur_action = actions + cur_i;

        // For each action that is (over)due.
        while ((cur_action = actions + cur_i)->time <= cur_time) {
            cur_i++;

            XTestFakeKeyEvent(display, cur_action->code,
                cur_action->down, CurrentTime);
            XFlush(display);
        }

        // Sleep for 1ms.
        nanosleep((struct timespec[]){{0, 1000000L}}, NULL);
    }
}

Я понимаю, что приведенный выше код очень специфичен для моего случая, но я подозреваю, что это более широкая проблема - и поэтому я спрашиваю об этом здесь.

Есть ли предел тому, как часто вы можете / должны сбрасывать XEvents? Может ли проблема быть в приложении, которое я отправляю, может быть, недостаточно быстро их прочитать?

1 Ответ

0 голосов
/ 15 июля 2018

Прошло немного времени, но после некоторой переделки выяснилось, что моя задержка между нажатием клавиши «вверх» и «вверх» была слишком мала. После установки этого значения в 15 мс приложение регистрирует действия как нажатия клавиш правильно и (все еще) с очень высокой точностью.

Я чувствую себя немного глупо в ретроспективе, но я чувствую, что это может быть тем, что другие могут наткнуться также.

...