我正在编写远程触摸板。所以我需要在Linux上用C ++模拟鼠标按键。我使用Xlib函数来做到这一点。
两个触控板按钮都能正常工作,但是例如当我在Linux桌面上按下右键时,会显示上下文菜单,然后通过左键按下模拟无法从中选择任何内容。我甚至无法通过点击它来删除该上下文菜单。
有人可以帮助我如何让我的模拟触控板按钮表现得像真的吗?
这是我的代码:
void MainWindow::mouseClick(int button)
{
// Open X display
Display *display = XOpenDisplay (NULL);
if (display == NULL)
{
cerr << "Can't open display!" << endl;
}
// Create and setting up the event
XEvent event;
memset (&event, 0, sizeof (event));
event.xbutton.button = button;
event.xbutton.same_screen = True;
XQueryPointer (display, RootWindow(display, DefaultScreen(display)),
&event.xbutton.root, &event.xbutton.subwindow,
&event.xbutton.x_root, &event.xbutton.y_root,
&event.xbutton.x, &event.xbutton.y,
&event.xbutton.state);
event.xbutton.subwindow = event.xbutton.window;
while (event.xbutton.subwindow)
{
event.xbutton.window = event.xbutton.subwindow;
XQueryPointer (display, event.xbutton.window,
&event.xbutton.root, &event.xbutton.subwindow,
&event.xbutton.x_root, &event.xbutton.y_root,
&event.xbutton.x, &event.xbutton.y,
&event.xbutton.state);
}
// Press
event.type = ButtonPress;
if (XSendEvent (display, PointerWindow, True, 0xfff, &event) == 0) cerr << "Error to send the event!" << endl;
XFlush (display);
usleep (1);
// Release
event.type = ButtonRelease;
event.xbutton.state = 0x100;
if (XSendEvent (display, PointerWindow, True, 0xfff, &event) == 0) cerr << "Error to send the event!" << endl;
XFlush (display);
usleep (1);
XCloseDisplay (display);
}
答案 0 :(得分:1)
在处理Xlib时遇到了类似的问题。我终于最终使用了Xtest库。这很简单。只需在你的linux盒子上安装libxtst。
XTestFakeMotionEvent(display, -1, x, y, CurrentTime );
XTestFakeButtonEvent(display, button, True, CurrentTime); //Mouse down
XTestFakeButtonEvent(display, button, False, CurrentTime); //Mouse up
您根本不必担心Windows层次结构!