2014-07-03 11 views
11

Questo è un problema strano solo in Win8.1.Win8.1 attiverà lo scaricamento e caricherà l'evento all'applicazione WPF quando chiudiamo e riconnettiamo a questa macchina utilizzando RDC da win7 o altro OS

Come tutti sappiamo, se c'è un'applicazione in esecuzione in una macchina, non ci dovrebbero essere altri comportamenti contro l'applicazione quando ci colleghiamo/disconnettiamo/ricolleghiamo a questa macchina tramite Connessione desktop remoto. Tuttavia, abbiamo rilevato che Win8.1 attiverà lo scaricamento e caricherà gli eventi nell'applicazione WPF quando chiudiamo e riconnettiamo alla macchina utilizzando RDC. E questo è un comportamento indesiderato che può causare errori.

Ecco i passaggi riprodurre stabili:

  1. scrivere un'applicazione WPF che contiene un pulsante e gestisce le scaricare e caricare eventi di questo tasto.
  2. Utilizzo di RDC per connettersi ad un Win8.1 da Win7 ad esempio.
  3. Nel desktop remoto, eseguire questa app WPF (un evento di caricamento verrà registrato in a.txt).
  4. Chiudere il RDC facendo clic sulla 'x'.
  5. Connettersi nuovamente a questo Win8.1.
  6. Vedrete lo scaricamento e caricare gli eventi sono stati sparati.

Se l'app WPF viene eseguita in Win7 o Win server 2008, tali eventi non verranno attivati.

Quindi, penso che sia un comportamento indesiderato in Win8.1. È un bug in Win8.1 RDP? O è una nuova funzionalità?

+0

Qualcuno potrebbe aiutarmi? E se necessario, è possibile scaricare il mio programma di test su https://www.hightail.com/download/ZUczbUpha0Q3N0RvS3NUQw. Questo programma scriverà un file a.txt nello stesso percorso per registrare gli eventi.Quindi, salta l'avviso dal tuo software antivirus. – capcom923

+0

So che è piuttosto inverosimile ma ho lo stesso problema. Hai trovato una soluzione? – SiriusNik

+0

Ho lo stesso problema, c'è qualche aggiornamento? –

risposta

0

Ciò si verifica perché la riconnessione di RDP notifica al codice WPF che l'applicazione di sessione ha modificato la sessione e lo schermo. WPF deve ricostruire le sue risorse DirectX e probabilmente gestire una dimensione dello schermo aggiornata (anche se la risoluzione potrebbe essere la stessa). Questo ha senso b/c il client RDP può specificare diverse funzionalità come il livello grafico e altre proprietà dalla scheda "Esperienza" RDP. WPF non stabilisce che i parametri siano tutti uguali all'ultima volta che si è verificata una connessione e attiva un nuovo ciclo di rendering e layout (ha senso poiché i colori e la risoluzione dello schermo potrebbero essere cambiati). Ciò comporta il ricaricamento dei controlli e l'attivazione di un nuovo evento caricato.

È possibile visualizzare gran parte dei dettagli cruenti di questo esaminando HwndTarget.cs nel sorgente .NET. Cerca questo file per "sessione" e vedrai MOLTO maneggiamento per la sessione di disconnessione/riconnessione.

http://referencesource.microsoft.com/#PresentationCore/Core/CSharp/System/Windows/Interop/HwndTarget.cs,f20f989ef219e391

Se si vuole trovare un modo per evitare di fare lavoro extra nel codice carico/scarico potrebbe essere necessario spostarlo in una funzione che è assicurarsi di chiamare una sola volta tramite una bandiera o assegno nullo .

possibile testimoniare ciò che sta accadendo con l'aggiunta di un punto di interruzione sul vostro gestore di eventi Loaded e andando su Strumenti> Opzioni, Debug e deselezionare "Attiva Just My Code", e selezionare "Attiva NET fonte quadro stepping" e verificare " Abilita il supporto del server di origine. Quando si connette RDP, il bkpt si innescherà e lo stack di chiamate mostrerà un evento di ridimensionamento tra altri livelli di chiamate. Ciò è probabilmente dovuto al fatto che WPF ha ottenuto anche un WM_DISPLAYCHANGE e che tutto è stato riformattato nel caso in cui ci sia più o meno risoluzione con questa connessione.

Problemi correlati