libvncclient SendPointerEvent只发送左键

时间:2014-10-14 00:03:17

标签: c++ qt vnc-viewer

我正在使用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 
)       

文件中的相关摘录:

  

指针事件包括光标位置和按钮蒙版。该   按钮掩码指示指示设备上的哪些按钮   按下。每个按钮由按钮掩码中的一个位表示。 1   表示按下按钮,而0表示不按下按钮   按压。

     

您可以通过对它们进行OR运算来使用这些预定义的按钮蒙版   在一起: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);
}

有关如何进行右键点击的任何线索?

提前谢谢: - )

1 个答案:

答案 0 :(得分:1)

这已经解决了。

问题是Qt发出的按钮数与VNC服务器预期的rfb按钮不匹配。同样,libvncserver的文档非常无用,因此按钮映射问题不会立即引起注意。

现在一切都运转良好。 :-D谢谢!