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项目?
我在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 个浮点数。