Я пытаюсь подменить нажатия клавиш; если быть более точным: я повторяю количество нажатий клавиш, которые все должны отправляться в определенное время - иногда несколько одновременно (или, по крайней мере, как близко друг к другу) насколько это возможно).
Реализуя это с помощью 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? Может ли проблема быть в приложении, которое я отправляю, может быть, недостаточно быстро их прочитать?