私は PC 上の VNCSharp WPF で同じ問題を抱えていましたが、VNC Sharp for WinForms をテストしたところ、問題なく動作しました。
さらに、デバッグで WPF の VNCSharp をテストしたところ、問題なく動作しましたが、リリースで失敗しました。
私はそれをデバッグするのに数時間を無駄にしました(ネットワークストリームの間違った場所からリモートデバイスの幅と高さを何らかの方法で読み取ることがわかったので、VNCプロトコルのいくつかの部分を学びました)。
このバグは float の比較に関連しています。使用しているマシンによって異なります (マシンによってはうまく動作する場合とそうでない場合があります)。
VncClient の 349 行目を見てください。
if (rfb.ServerVersion == 3.8) rfb.ReadSecurityFailureReason();
デバッグ中にそこにブレークポイントを置くと、rfb.ServerVersion が 3.8f であることがわかります。
ServerVersion は、計算された float を返します。
public float ServerVersion {
get {
return (float) verMajor + (verMinor * 0.1f);
}
}
ServerVersion が 3.8 であるため、ReadSecurityFailureReason が実行され、コードが機能するために必要な余分なバイトが読み取られることを期待する必要がありますが、リリース時 (Visual Studio リリースではコードがデバッグされているため、Ctrl+F5)おそらく問題なく動作します) これらの余分なバイトは読み取られないため、幅と高さがストリームの間違った場所から読み取られ、0px を超える 0px になります。
私の主張を実証するために、次のコードを取得し、x86 としてコンパイルしてください (これがここの状況であるため、x64 マシンと x64 OS があると想定しています)。
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" というメッセージが表示されるはずです。ここで、Release 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 つの float を比較する代わりに、新しい関数を使用して比較するようにコードを変更しました。