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

Mouse button simulation - right button and context menu problem

本文关键字:上下文 菜单 问题 右键 按钮 模拟 鼠标      更新时间:2023-10-16

我正在编程远程触摸板。所以我需要在c++中模拟Linux上的鼠标按钮。我使用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);
}

我在处理Xlib时遇到了类似的问题。我最终使用了Xtest库。这很简单。在你的linux机器上安装libxtest。

XTestFakeMotionEvent(display, -1, x, y, CurrentTime );
XTestFakeButtonEvent(display, button, True, CurrentTime); //Mouse down
XTestFakeButtonEvent(display, button, False, CurrentTime); //Mouse up

你根本不需要担心windows的层次结构!