我试图将键击发送到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)
我尝试了几种变体,包括没有面具 - 没有成功。