XTestFakeKeyEvent调用被吞没

时间:2018-07-04 15:57:02

标签: x11

我正试图欺骗击键;更精确一点:我正在重放一些击键,这些击键应该在某个特定时间发送,有时是同时发送(或至少一次尽可能合在一起)。

使用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);
    }
}

我意识到上面的代码非常适合我的情况,但是我怀疑这是一个更广泛的问题-这也是为什么我在这里问这个问题。

刷新/刷新XEvent的频率是否有限制?我发送的应用程序是否可能会成为问题,或者可能无法足够快地读取它们?

1 个答案:

答案 0 :(得分:2)

已经有一段时间了,但是经过一番修补之后,事实证明我在按下按键和按下按键之间的延迟太短了。将其设置为15ms后,应用程序可以正确且(非常)准确地将动作注册为击键。

回想起来,我有点傻,但是我确实觉得这可能也是其他人偶然发现的。