2

首先,我已经学习 Microsoft Surface 大约 1-2 个月了,我的项目要求我考虑将 VNC 查看器的使用整合到我的 Surface 应用程序中。

我已经从VNC 控件中研究了 VNCSharp 和 VNCSharpWpf用于 WPF 应用程序,我目前正在使用 VNCSharpWpf,因为它在 WPF 环境中具有更好的用户交互,尽管与那里的查看器相比性能有些欠缺。

这是我的问题,Microsoft Surface WPF 和默认 WPF 在处理帧缓冲区/线程方面有什么区别吗?

我注意到,当客户端尝试在 Surface 环境中绘制矩形时,会导致要更新的矩形的宽度和高度为 0 的异常。

但是,当我在 VNCSharpWPF 的作者提供的示例代码(Windows 上的 WPF)上对其进行测试时,该错误永远不会发生。

我尝试通过设置和 if 子句来解决问题,仅在解码的矩形的宽度和高度不为 0 时才绘制。虽然它可以防止应用程序崩溃,但只要屏幕发生变化,它就会导致屏幕周围出现死像素服务器端。

我已经被这种情况困住了 1-2 周,并且已经没有想法了,需要一些关于我应该研究的地方的指导

或者是否有任何很酷的 VNC 查看器/服务器可以用于我错过的 Surface 项目?

4

1 回答 1

3

我在 PC 上使用 VNCSharp WPF 时遇到了同样的问题,当为 WinForms 测试 VNC Sharp 时,它工作正常。

此外,当我在调试时为 WPF 测试 VNCSharp 时,它工作正常,但在发布时失败。

我已经浪费了几个小时调试它(我已经学习了 VNC 协议的某些部分,因为我发现它以某种方式从网络流中的错误位置读取远程设备的宽度和高度)。

该错误与浮动比较有关。这取决于您拥有的机器(它可能在某些机器上运行良好,而在其他机器上可能不行)

请查看 VncClient,第 349 行:

  if (rfb.ServerVersion == 3.8) rfb.ReadSecurityFailureReason();

如果你在调试的时候放一个断点,你会看到 rfb.ServerVersion 是 3.8f

ServerVersion 返回一个计算的浮点数:

    public float ServerVersion {
        get {
            return (float) verMajor + (verMinor * 0.1f);
        }
    }

您应该期望,因为 ServerVersion 是 3.8,所以它将执行 ReadSecurityFailureReason 读取代码工作所需的一些额外字节,但在发布时(Ctrl+F5,因为在 Visual Studio Release 中,在调试代码时,它可能会正常工作)那些额外的字节将不会被读取,因此宽度和高度将从流上的错误位置读取,导致它是 0px 超过 0px

为了证明我的观点,请使用以下代码,并将其编译为 x86(我假设您有 x64 机器和 x64 操作系统,因为这是这里的情况):

    class Program
{
    static void Main(string[] args)
    {
        SomeVersion someVersion = new SomeVersion(3, 8);

        if (someVersion.Version == 3.8f)
        {
            Console.WriteLine("Version is 3.8");
        }

        Console.ReadLine();
    }

}

public class SomeVersion
{
    private int _major;
    private int _minor;

    public SomeVersion(int major, int minor)
    {
        _major = major;
        _minor = minor;
    }

    public float Version
    {
        get
        {
            return (float)_major + (_minor * 0.1f);
        }
    }
}

在 Debug x86 中运行代码(使用 Visual Studio 调试器和 Ctrl+F5)您应该看到在这两种情况下都收到消息:“版本为 3.8”。现在将其更改为 Release x86... 使用 F5 运行它。你应该得到消息。现在用 Ctrl + F5 运行它... WTF ??,没有消息!

为了修复 Vnc Sh​​arp WPF 中的错误,我采用了 RfcProtocol 类,并添加了另一个函数:

    public bool CompareVersion(int major, int minor)
    {
        return major == verMajor && minor == verMinor;
    }

现在在 VNC 客户端(第 188 行和第 349 行)上,我更改了代码,因此它将使用新函数进行比较,而不是比较 2 个浮点数。

于 2014-01-20T06:53:56.957 回答