2013-10-24 1 views
2

Прежде всего, я изучаю Microsoft Surface около 1-2 месяцев, и мой проект требует, чтобы я изучил возможность использования средства просмотра VNC в своем приложении для поверхностных приложений.Проблемы с VNCSharpWpf для WPF в Microsoft Surface

Я изучил VNCSharp и VNCSharpWpf от VNC control for WPF application, и сейчас я использую VNCSharpWpf, так как он лучше взаимодействует с пользователем в среде WPF, хотя производительность несколько отсутствует по сравнению с зрителями.

Вот мой вопрос, есть ли разница между Microsoft Surface WPF и WPF по умолчанию в том, как они обрабатывают framebuffer/threads?

Я заметил, что когда клиент пытается нарисовать прямоугольник в среде Surface, это вызовет исключение, где по прямоугольнику, подлежащему обновлению, будет 0 ширины и высоты.

Однако, когда я тестирую его на примере кода, предоставленного автором VNCSharpWPF (WPF on Window), ошибка никогда не возникает.

Я попытался обходным путем установкой и предложением if, только если ширина и высота прямоугольника декодированы не 0. Хотя это и предотвращает сбой приложения, это приведет к получению мертвого пикселя вокруг экрана всякий раз, когда происходят изменения на экране в конце сервера.

Я застрял с этой ситуацией в течение 1-2 недель, уже и закончился идеи и нуждается в некотором руководстве о том, где я должен смотреть в

Или есть любой зритель прохладно VNC/сервер, который я могу использовать для моего проекта Surface, который я пропустил?

ответ

3

У меня была такая же проблема с VNCSharp WPF на ПК, а при тестировании VNC Sharp для WinForms она работала нормально.

Кроме того, когда я протестировал VNCSharp для WPF на Debug, тогда он работает нормально, но не работает при выпуске.

Я потратил несколько часов на отладку (я изучил некоторые части протокола 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, который считывает некоторые дополнительные байты, необходимые для работы кода, но в 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); 
     } 
    } 
} 

Выполните код отладки 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), I» мы изменили код, чтобы он сравнивался с использованием новой функции, вместо сравнения двух поплавков.

+0

Привет, Сарагани, Благодарим вас за ответ. – angelhalo

+0

плюс 1 для указания ошибки и представления решения. –