繁体   English   中英

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

[英]Mouse button simulation - right button and context menu problem

我正在编程远程触摸板。 所以我需要在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 盒子上安装 libxtst。

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

您完全不必担心 windows 层次结构!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM