Domanda

Abbiamo un processo notturno che aggiorna le applicazioni sul pc di un utente, e che richiede l'applicazione portando verso il basso e il backup di nuovo (non in cerca di entrare in evoluzione quel processo).

Il problema è che stiamo costruendo un AppBar di Windows all'avvio che richiede uno schermo valido, e quando il sistema è bloccato, non ce n'è uno nella classe Screen. Così nessuno degli effetti visivi sono abilitati e si presenta davvero brutta.

L'unico modo attualmente abbiamo intorno a questo è quello di individuare uno schermo bloccato e solo girare e aspettare fino a quando l'utente sblocca il desktop, quindi continuare lancio. Lasciando il basso non è un'opzione, in quanto questa è una parte fondamentale del flusso di lavoro del nostro utente, e si aspettano di essere installato e funzionante, se hanno lasciato in questo modo la sera prima.

Tutte le idee ?? Non riesco a trovare le informazioni sul display da nessuna parte, ma deve essere conservato fuori da qualche parte, in quanto l'utente è ancora connesso.

I contenuti della matrice Screen.AllScreens:

** Quando Bloccato:

Device Name    : DISPLAY
Primary        : True
Bits Per Pixel : 0
Bounds         : {X=-1280,Y=0,Width=2560,Height=1024}
Working Area   : {X=0,Y=0,Width=1280,Height=1024}

** Quando Sbloccato:

Device Name    : \\.\DISPLAY1
Primary        : True
Bits Per Pixel : 32
Bounds         : {X=0,Y=0,Width=1280,Height=1024}
Working Area   : {X=0,Y=0,Width=1280,Height=994}

Device Name    : \\.\DISPLAY2
Primary        : False
Bits Per Pixel : 32
Bounds         : {X=-1280,Y=0,Width=1280,Height=1024}
Working Area   : {X=-1280,Y=0,Width=1280,Height=964}
È stato utile?

Soluzione

Non esiste una soluzione pulita per questo, Windows non fornisce un modo per rilevare che la stazione di lavoro è bloccata e che il desktop "sbagliato" è attiva. È possibile rilevare solo l'interruttore della sessione, codice di esempio è qui . Per fare questo lavoro, sei praticamente costretti a includere questo codice nella app e averlo lasciare un breadcrumb che potesse leggere indietro quando si avvia il backup. Assicurarsi di ripristinare dopo è stato utilizzato una volta in modo che l'applicazione non può rimanere bloccato in modo permanente.

Altri suggerimenti

Questo problema blocco dello schermo dipende da quale versione si utilizza, sia XP che utilizza GINA che blocca lo schermo e Vista che utilizza ContentProvider, entrambi questi meccanismi sono in ultima analisi responsabile di questo.

L'unico modo per vedere se lo schermo è bloccato, è un salvaschermo calci, (questo può essere facilmente interrogato eseguendo un PInvoke per interrogare SystemsParameterInfo , per scoprire se lo screensaver è attivo o no - SPI_GETSCREENSAVERRUNNING e SPI_GETSCREENSAVESECURE per determinare se che attiveranno GINA o Content Provider) quando si preme il tasto Windows + L a calci nel screensaver, dopo il periodo di tempo specificato, se non l'attività, quindi GINA o ContentProvider calci e sostituisce lo screensaver con un schermata di blocco ... ho incluso due link pertinenti che è stato pubblicato qui circa le informazioni di registrazione sicuro sotto Windows ...

Ci vorrebbe un po 'di lavoro, ma si potrebbe utilizzare EnumDisplayDevices, EnumDisplaySettingsEx, MonitorFromPoint, GetMonitorInfo il tutto da user32 e prendere un colpo di schermo del dispositivo.

Se il PC è bloccato, o se v'è un salvaschermo attivo, allora la cattura dello schermo è sempre un colore beige. Si potrebbe verificare la presenza di tale condizione di conoscere il sistema è bloccato. Questo funziona su sistemi in fase di RDPed in anche (Thin client a XP VDI per esempio.)

Almeno che funziona nel mio ambiente. Esempi di codice possono essere trovati da usare Google.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top