我试图欺骗击键;更准确一点:我正在重播一些按键,这些按键应该在某个时间发送 - 有时几次同时发送(或者至少尽可能合近)。
使用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的频率是否有限制?可能我发送的应用程序是问题,可能没有足够快地阅读它们?
这已经过了一段时间,但经过一些修补,结果表明我在按键和按键之间的延迟太低了。将其设置为15ms后,应用程序将操作正确地按键记录,并且(仍然)以非常高的精度记录。
回想起来我觉得有点傻,但我觉得这可能是别人可能偶然发现的事情。