Я работаю над средством просмотра VNC, используя Qt 5 и libvncserver / libvncclient библиотека. Я создаю подкласс QWidget для предоставления виджета VNC Viewer.
Я могу подключиться к серверу VNC (на котором запущены TightVNC и Windows XP), я могу перемещать удаленный курсор, могу щелкать левой кнопкой мыши и перетаскивать объекты через средство просмотра, однако мне не удалось получить права -клики на работу. Это похоже на то, что сервер игнорирует отправленные ему правые щелчки, хотя везде, где я щелкаю правой кнопкой мыши, похоже, изменяется фокус окна на сервере, но не значки.
К сожалению, документация libvncclient не очень полезна, если вы еще не являетесь экспертом. Я просмотрел код нескольких проектов для помощи и попытался использовать подходы там безуспешно. Тот, на котором я остановился для справки:
https://github.com/LibVNC/libvncserver/blob/master/client_examples/SDLvncviewer.c#L383
Это функция SendPointerEvent:
rfbBool SendPointerEvent (rfbClient * client,
int x,
int y,
int buttonMask
)
Соответствующая выдержка из документации:
Событие указателя включает в себя местоположение курсора и маску кнопки.
маска кнопок показывает, какие кнопки на устройстве указания
нажат. Каждая кнопка представлена битом в маске кнопки. А 1
означает, что кнопка нажата, а 0 означает, что она не
нажат.Вы можете использовать эти предопределенные маски кнопок, ORing их
вместе: rfbButton1Mask, rfbButton2Mask, rfbButton3Mask,
rfbButton4Mask rfbButton5Mask
Я не понимаю, когда, где и как я должен использовать эти предопределенные маски кнопок. Я посмотрел на перечисление, и все они просто соответствуют «1», «2», «3» и т. Д. Qt выдает «1» для левой кнопки и «2» для правой кнопки.
Вот мой соответствующий код:
static int nButtonMask;
void VncViewer::handleMouseEvents(QMouseEvent* event)
{
if (event->type() == QMouseEvent::MouseButtonPress) {
nButtonMask |= event->button();
}
if (event->type() == QMouseEvent::MouseButtonRelease) {
nButtonMask &= ~event->button();
}
SendPointerEvent(g.currentViewer->client, event->x(), event->y(), nButtonMask);
nButtonMask &= ~(rfbButton4Mask | rfbButton5Mask);
}
Любые подсказки о том, как заставить работать щелчки правой кнопкой мыши?
Заранее спасибо 🙂
Это решено.
Проблема заключалась в том, что номера кнопок, излучаемых Qt, не совпадали с кнопками rfb, ожидаемыми сервером VNC. Опять же, документация libvncserver оказалась очень бесполезной, поэтому проблема с отображением кнопок не была заметна сразу.
Теперь все работает хорошо. Спасибо!