Симуляция кнопки мыши - проблема с правой кнопкой и контекстным меню - PullRequest
1 голос
/ 27 апреля 2011

Я программирую удаленную сенсорную панель. Поэтому мне нужно смоделировать нажатие кнопки мыши на 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 Ответ

1 голос
/ 13 июля 2011

Я столкнулся с подобной проблемой при работе с Xlib.Я, наконец, в конечном итоге с помощью библиотеки Xtest.Это довольно просто.Просто установите libxtst на вашу Linux-систему.

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

Вам не нужно беспокоиться об иерархии Windows!

...