XSendEvent不起作用
XSendEvent not working
本文关键字:不起作用 XSendEvent 更新时间:2023-10-16
我正试图根据这个例子和随后的注释发送一个X事件:
#include <X11/Xlib.h>
#include <X11/keysym.h>
#include <cstdio>
#include <iostream>
#include <string>
#include <unistd.h>
// #include <X11/extensions/XTest.h> // Uncomment to use XTestFakeKeyEvent()
// The key code to be sent.
// A full list of available codes can be found in /usr/include/X11/keysymdef.h
#define KEYCODE XK_Down
// Function to create an X11 keyboard event
// http://www.doctort.org/adam/nerd-notes/x11-fake-keypress-event.html
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 = XKeysymToKeycode(display, keycode);
event.state = modifiers;
if (press)
event.type = KeyPress;
else
event.type = KeyRelease;
return event;
}
int main() {
// Obtain the X11 display.
Display *display = XOpenDisplay(0);
if (display == NULL) return -1;
// Get the root window for the current display.
Window winRoot = XDefaultRootWindow(display);
// Find the window which has the current keyboard focus.
Window winFocus;
int revert;
XGetInputFocus(display, &winFocus, &revert);
// Send a fake key press event to the window.
XKeyEvent event =
createKeyEvent(display, winFocus, winRoot, true, KEYCODE, 0);
int res = XSendEvent(event.display, event.window, True, KeyPressMask,
(XEvent *)&event);
// int res =
// XTestFakeKeyEvent(event.display, event.keycode, True, CurrentTime);
std::cout << ((res != 0) ? std::string("Sent successfully")
: std::string("Sending failed")) << std::endl;
sleep(1);
if (XPending(display))
std::cout << "Got it!" << std::endl;
else
std::cout << "It's lost..." << std::endl;
// Done.
XCloseDisplay(display);
return 0;
}
根据输出,无论我使用XSendEvent
还是XTestFakeKeyEvent
(注释掉的代码),事件都会被发送为OK,然后丢失。我正在Ubuntu 14.04下使用gcc 4.8.2编译代码。缺少什么?
为了接收事件,X11应用程序通常需要注册对它们的兴趣。这是通过XSelectInput
功能完成的:
XSelectInput(display, winFocus, KeyPressMask|KeyReleaseMask);
告诉X11这个客户端想要接收与winFocus
相关联的按键和按键释放事件。
相关文章:
- 我的神经网络不起作用 [XOR 问题]
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- C++为什么尽管我调用了void函数,它却不起作用
- 为什么在保护模式下继承升级不起作用
- 循环在计数器中不起作用
- 在其他文件中创建类时在 c++ 项目中不起作用
- Visual studio代码重构似乎不起作用(例如,重命名符号-f2)
- 为什么二进制搜索在我的测试中不起作用
- 我的代码中有错误吗?使用BGI图形的C++代码对我不起作用
- 为什么 const std::p air<K,V>& 在 std::map 上基于范围的 for 循环不起作用?
- 带有指定长度字符* 参数的 std::regex_search 在 VS2017 中不起作用?
- Bjarne Stroustrup Book - std_lib_facilities.h - 不起作用(未知类型名称)
- 为什么简单的算术减法在"if"条件下不起作用?
- 为什么Stroustup书中的has_f不起作用
- 你能检查一下为什么在这个代码中从链接列表中删除项目不起作用吗
- 嵌套While循环不起作用(C++问题)
- C++Matching Brackets 2解决方案不起作用
- 为什么这段代码不起作用,我该如何解决?
- XSendEvent不起作用