0

我正在使用 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 表示未按下。

您可以通过 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);
}

有关如何使右键单击起作用的任何线索?

先感谢您 :-)

4

1 回答 1

1

这解决了。

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

现在一切正常。:-D 谢谢!

于 2014-10-22T02:47:31.973 回答