Microsoft Surface中的WPF的VNCSharpWpf问题

时间:2013-10-24 02:46:47

标签: c# wpf vnc pixelsense

首先,我一直在学习Microsoft Surface大约1-2个月,我的项目要求我考虑将VNC查看器的使用纳入我的Surface应用程序。

我已经从VNC control for WPF application查看了VNCSharp和VNCSharpWpf,我现在正在使用VNCSharpWpf,因为它在WPF环境中有更好的用户交互,尽管与那里的观众相比,性能有些欠缺。

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

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

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

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

我已经坚持这种情况已经持续了1-2周,并且已经没有想法,需要一些关于我应该调查的指导

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

1 个答案:

答案 0 :(得分:3)

我在PC上遇到了与VNCSharp WPF相同的问题,并且在为WinForms测试了VNC Sharp时,它运行正常。

此外,当我在Debug上测试VNCSharp for WPF时,它运行正常,但在Release上失败。

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

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

请查看第349行的VncClient:

  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读取代码工作所需的一些额外字节,但是在Release(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个浮点数。