gpt4 book ai didi

c++ - XSendEvent 不会更改修饰键状态

转载 作者:行者123 更新时间:2023-11-30 16:59:31 25 4
gpt4 key购买 nike

我尝试通过创建 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 服务器已接收并处理按键事件)。

但是,当检索修饰键的当前状态时,修饰键似乎根本没有被按下。调用 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 和我的代码中的状态掩码。

如何正确更改当前修饰键状态?

最佳答案

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

关于c++ - XSendEvent 不会更改修饰键状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38093372/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com