VNCSharpWpf for WPF 在 Microsoft Surface 中的问题

本文关键字:问题 Surface Microsoft for WPF VNCSharpWpf | 更新日期: 2023-09-27 18:36:43

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

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

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

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

但是,当我在VNCSharpWPF的作者提供的示例代码(窗口上的WPF)上测试它时,错误永远不会发生。

我试图通过将 if 子句设置为 if 仅在解码的矩形的宽度和高度不为 0 时才绘制来解决。虽然它可以防止应用程序崩溃,但每当服务器端的屏幕发生变化时,它都会导致屏幕周围出现坏点。

我已经遇到这种情况 1-2 周了,已经没有想法了,需要一些关于我应该研究的指导

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

VNCSharpWpf for WPF 在 Microsoft Surface 中的问题

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

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

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

该错误与浮点数比较有关。这取决于您拥有的机器(它可能在某些机器上运行良好,而在另一些机器上可能不工作)

请看VncClient,第349行:

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

如果在调试时在此处放置断点,则会看到该 rfb。服务器版本为 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);
        }
    }
}

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

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

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

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