libvncclient SendPointerEvent只发送左按钮

libvncclient SendPointerEvent sending only left button

本文关键字:按钮 SendPointerEvent libvncclient      更新时间:2023-10-16

我正在使用Qt 5和libvncserver/libvncclient库开发VNC查看器。我正在对QWidget对象进行子类化,以提供VNC查看器小部件。

我可以连接到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 
)       

文件的相关摘录:

指针事件包括一个光标位置和一个按钮掩码。这个按钮掩码指示定点设备上的按钮按下。每个按钮都由按钮掩码中的一个位表示。A 1表示按钮已按下,0表示未按下按下

您可以通过OR来使用这些预定义的按钮掩码一起:rfbButton1Mask,rfbButtion2Mask,rfb按钮4任务rfb按钮5任务

我不知道何时、何地以及如何使用这些预定义的按钮掩码。我查看了枚举,它们都与"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发出的按钮编号与VNC服务器预期的rfb按钮不匹配。同样,libvncserver的文档非常没有帮助,因此按钮映射问题并没有立即引起注意。

现在一切都很顺利-D谢谢!