2013-10-24 28 views
2

首先,我一直在学习Microsoft Surface大约1-2个月的时间,而我的项目需要我考虑将VNC查看器的使用合并到我的Surface应用程序中。Microsoft Surface中用于WPF的VNCSharpWpf问题

我已经查看了VNC control for WPF application的VNCSharp和VNCSharpWpf,我目前使用的是VNCSharpWpf,因为它在WPF环境中具有更好的用户交互,尽管与观看者相比,性能有点欠缺。

这是我的问题,是微软表面WPF和默认的WPF在他们如何处理framebuffer /线程之间有任何区别?

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

但是,当我在示例代码上测试它时,VNCSharpWPF的作者提供了(WPF在Window上),错误从不发生。

我试图通过设置和if子句来解决该问题,如果解码的矩形的宽度和高度不是0,则只绘制解决方案。虽然它可以防止应用程序崩溃,但每当出现更改时,它都会导致屏幕上出现坏点在服务器端的屏幕中。

我已经遇到这种情况1-2周已经并跑出的想法,是需要一些指导对我应该看看

其中还是有什么酷的VNC查看器/服务器在那里,我可以使用我的Surface项目,我错过了?

回答

3

我一直在PC上使用VNCSharp WPF时出现同样的问题,当测试VNC Sharp for WinForms时,它的工作正常。此外,当我在Debug上测试了WPF的VNCSharp时,它工作正常,但在发布时失败。

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

该错误与浮点数比较有关。这取决于你在机器上(它可能在某些机器上运作良好,对他人也可能不)

请看VncClient,线349:

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

如果,在调试时,把一个断点在那里,你会看到rfb.ServerVersion是3.8f

ServerVersion返回calcualted浮动:

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

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

对于demontrating我的观点,请采取以下代码,并将其编译为x86 (我假设你有一个64位机和64位操作系统,因为这是这里的情况):

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); 
     } 
    } 
} 

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

为了解决在VNC夏普WPF的bug,我已经采取了类RfcProtocol,并添加另一个功能:

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

现在的VNC客户端(包括线188和349),我已经改变了代码,所以它会使用新函数进行比较,而不是比较两个浮点数。

+0

嗨Saragani,谢谢你的回复。 – angelhalo

+0

加1用于指出Bug并提供解决方案。 –