【问题标题】:XSendEvent does not change modifier key stateXSendEvent 不会改变修饰键状态
【发布时间】: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


【解决方案1】:

通过使用库 <X11/extensions/XTest.h> 中的方法 int XTestFakeButtonEvent(display, button, is_press, delay) 解决了该问题。出于某种原因,这会导致键盘修饰键状态在发送修饰键时发生变化(如我所愿),而上述方法不会。

【讨论】:

    【解决方案2】:

    来自 xsendevent 手册页:

    “除了在转发的事件中强制 send_event 为 True 并正确设置事件中的序列号之外,事件的内容不会被 X 服务器更改和检查。”

    我假设您从以下位置复制了 createKeyEvent():http://www.doctort.org/adam/nerd-notes/x11-fake-keypress-event.html

    如果你也复制了这个函数的调用方式:

    createKeyEvent(display, winFocus, winRoot, false, KEYCODE, 0);

    那么“修饰符”没有设置为任何东西是有道理的,因为最后一个参数是“0”。根据文档,您需要自己设置修饰符状态。

    我没有验证此信息。如果它没有按文档说明工作,那可能是文​​档错误或 X 服务器实现中的错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-11-15
      • 2019-01-30
      • 2019-05-15
      • 1970-01-01
      • 1970-01-01
      • 2019-07-13
      • 1970-01-01
      • 2011-08-10
      相关资源
      最近更新 更多