【发布时间】:2016-06-29 07:46:17
【问题描述】:
我正在尝试通过创建 XKeyEvent 并使用 XSendEvent 发送关键事件(受this 帖子的启发)。 XKeyEvents 准备如下:
XKeyEvent createKeyEvent(Display *display, Window win, Window winRoot, _Bool 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 = keycode;
event.state = modifiers;
if (press) {
event.type = KeyPress;
} else {
event.type = KeyRelease;
}
return event;
}
然后用XSendEvent(event.display, event.window, 1, KeyPressMask, (XEvent *)&event);发送它们
键事件被发送,目标程序接收它们(输入字母,箭头键工作等)。但是,修饰键会出现问题。假设程序为 opt/alt 键发送一个按键事件。在这种情况下,菜单栏中的文本会加下划线,直到发送按键事件(表示 X-server 已接收并处理按键事件)。
但是,当检索修饰键的当前状态时,修饰键似乎根本没有被按下。调用XQueryPointer(self->display, winFocus, &root_return, &child_return, &root_x_return, &root_y_return, &win_x_return, &win_y_return, &keyboard_state_mask); 时,keyboard_state_mask 为0。用xev 检查键盘给出了相同的结果。在xev 和我的代码中,物理按下修饰键确实会更改状态掩码。
如何正确更改当前的修饰键状态?
【问题讨论】:
-
我不太清楚,但是您是否期望键盘修饰符状态的 X11 服务器视图会受到您发送的事件的影响?
-
是的,我希望这会发生。
标签: c++ c x11 keyboard-events xlib