鼠标按钮模拟 - 右键和上下文菜单问题

时间:2011-04-27 09:48:39

标签: c++ linux xlib

我正在编写远程触摸板。所以我需要在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);
}

1 个答案:

答案 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层次结构!