Pregunta

Tenemos un proceso nocturno que actualiza las aplicaciones en el PC de un usuario, y eso requiere que presentó el recurso abajo y una copia de seguridad de nuevo (no buscan entrar en el cambio de ese proceso).

El problema es que estamos construyendo un AppBar Windows en el lanzamiento que requiere una pantalla válida, y cuando el sistema está bloqueado no hay uno en la clase Screen. Por lo que ninguno de los efectos visuales están habilitados y se nota hasta bien feo.

La única forma que tenemos actualmente de evitar esto es para detectar una pantalla bloqueada y simplemente girar y esperar hasta que el usuario desbloquea el escritorio, y luego continuar lanzamiento. Dejando abajo no es una opción, ya que es una parte clave del flujo de trabajo de nuestros usuarios, y esperamos que sea en funcionamiento si dejaban de esa manera la noche anterior.

¿Alguna idea ?? Me parece que no puede encontrar la información de la pantalla en cualquier lugar, pero tiene que ser almacenada en alguna parte fuera, ya que el usuario ha iniciado sesión en.

El contenido de la matriz Screen.AllScreens:

** cuando está bloqueado:

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}

** Cuando está desbloqueado:

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}
¿Fue útil?

Solución

No hay una solución limpia para esto, Windows no proporciona una manera de detectar que la estación de trabajo está bloqueada y que el escritorio "malo" está activo. Sólo se puede detectar el interruptor de la sesión, código de ejemplo es aquí . Para realizar este trabajo, que está bastante forzado a incluir este código en la aplicación y tienen que dejar un pan rallado que podría leer de nuevo cuando comienza a subir. Asegúrese de restablecerla después de usarlo una vez para que la aplicación no puede atascarse de forma permanente.

Otros consejos

Este problema de bloqueo de pantalla depende de la versión que está utilizando, ya sea XP que utiliza GINA que bloquea la pantalla y Vista que utiliza ContentProvider, ambos mecanismos son en última instancia responsables de esto.

La única manera de ver si la pantalla está bloqueada, es un protector de pantalla se activa, (esto puede ser fácilmente consultada mediante la ejecución de un PInvoke para consultar SystemsParameterInfo , para averiguar si el salvapantallas está activo o no - SPI_GETSCREENSAVERRUNNING y SPI_GETSCREENSAVESECURE para determinar si eso va a desencadenar GINA o proveedor de contenidos) al presionar WinKey + L para una patada en la pantalla, después del período de tiempo especificado, si no hay actividad, a continuación, GINA o ContentProvider entra en acción y sustituye a la pantalla con una pantalla de bloqueo ... he incluido dos enlaces relevantes que se publican aquí acerca de la información de registro con seguridad en Windows ...

Se requeriría un poco de trabajo, sin embargo, puede utilizar EnumDisplayDevices, EnumDisplaySettingsEx, MonitorFromPoint, GetMonitorInfo todos de user32 y tomar una captura de pantalla del dispositivo.

Si el PC está bloqueado, o si hay un protector de pantalla activa, entonces la captura de pantalla es siempre un color amarillento. Se puede comprobar que la condición para conocer el sistema está bloqueado. Esto funciona en sistemas que se están RDPed en también (cliente ligero a XP VDI por ejemplo.)

Al menos que funciona en mi entorno. Ejemplos de código se pueden encontrar buscando en Google.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top