使用XSendEvent模拟Linux中活动窗口的击键不起作用

时间:2016-08-27 00:28:30

标签: c linux x11 gtk3

我试图将键击发送到Linux中的活动窗口,我在Windows中使用SendInput进行操作。

以下代码基于this page

然而,该代码在Linux下无法运行。我尝试了几种变体但没有成功,包括首先为所涉及的密钥发送密钥释放事件(相关代码在下面注释,在auto_key中)。

我没有收到任何错误或警告。它根本不发送击键。我无法判断事件是否不正确,或活动窗口是否未正确定位。

我有一对像这样定义的函数:

XKeyEvent createKeyEvent(Display *display, Window win, Window winRoot, int press, int keycode, int modifiers) {
    XKeyEvent event;

    event.display     = display;
    event.window      = win;
    event.root        = winRoot;
    event.subwindow   = None;
    event.time        = CurrentTime;
    event.x           = 1;
    event.y           = 1;
    event.x_root      = 1;
    event.y_root      = 1;
    event.same_screen = True;
    event.keycode     = XKeysymToKeycode(display, keycode);
    event.state       = modifiers;

    if(press)
        event.type = KeyPress;
    else
        event.type = KeyRelease;

    return event;
}

void auto_key(int keycode, int modifiers) {
    XKeyEvent event;
    Window winFocus;
    int revert;

    /* Get X11 display */
    Display *display = XOpenDisplay(0);
    if (!display) return;

    /* Get root window, and focused window */
    Window winRoot = XDefaultRootWindow(display);
    XGetInputFocus(display, &winFocus, &revert);

    /* Key release
    event = createKeyEvent(display, winFocus, winRoot, 0, keycode, modifiers);
    XSendEvent(event.display, event.window, True, KeyPressMask, (XEvent *)&event); */

    /* Keypress */
    event = createKeyEvent(display, winFocus, winRoot, 1, keycode, modifiers);
    XSendEvent(event.display, event.window, True, KeyPressMask, (XEvent *)&event);

    /* Wait a tad */
    g_usleep (10000);

    /* Key release */
    event = createKeyEvent(display, winFocus, winRoot, 0, keycode, modifiers);
    XSendEvent(event.display, event.window, True, KeyPressMask, (XEvent *)&event);

    XCloseDisplay(display);
}

我称之为:

auto_key(XK_C, GDK_CONTROL_MASK)

我尝试了几种变体,包括没有面具 - 没有成功。

0 个答案:

没有答案