sesion - ¿Qué pasa ''detrás'' de la pantalla de bloqueo de windows?
como cambiar fondo de pantalla windows 10 sin activar (2)
Básicamente, lo que sucede es que Windows cambia al escritorio seguro, hace que sea el actual, por lo que la entrada ahora está asociada con él.
El escritorio antiguo permanece donde estaba: todos los HWND del escritorio todavía están allí, y cualquier subproceso adjunto a ese escritorio todavía puede acceder a esos HWND, obtener su ubicación, etc. Aún puede enviar mensajes a Windows en este escritorio, siempre que el hilo que envía el mensaje también esté en ese escritorio.
Sin embargo, dado que el escritorio ahora está inactivo, no puede recibir información. GetForegroundWindow devolverá NULL (IIRC) y ya no podrá usar SendInput, ya que la entrada ahora pertenece a [un subproceso en] un escritorio diferente; ningún control en ese escritorio inactivo puede recibir atención.
Tenga en cuenta que el envío de mensajes de pulsación de tecla a un control que no tiene enfoque a veces puede causar un comportamiento inesperado, ya que la aplicación o el control en general nunca esperan recibir entrada de teclado sin obtener el enfoque primero. (Esto puede ser problemático para los controles que configuran algún tipo de contexto de entrada en WM_SETFOCUS y lo borran en WM_KILLFOCUS, por ejemplo).
En resumen, la interfaz de usuario todavía está allí: puede hacer ciertas consultas en su contra, pero ya no puede automatizarla como podría hacerlo en un escritorio normal mediante el envío de entradas, y algunas otras funciones relacionadas con el enfoque o la entrada pueden fallar.
No estoy muy familiarizado con AutoHotKey, pero el nombre y la descripción de la funcionalidad sugieren que depende en gran medida de la API de entrada de envío Win32 subyacente. Esto no funcionará en absoluto para la entrada del teclado cuando un escritorio está inactivo.
Para obtener una descripción general razonable de cómo funcionan los escritorios y cómo se relacionan con las estaciones de Windows, el escritorio bloqueado, etc., consulte el artículo de Escritorio en MSDN .
Un problema que encontré en el pasado con los equipos de escritorio y la automatización es: cómo puedo dejar una prueba de larga duración que utiliza algún tipo de automatización de entrada del usuario (mouse, simulación de teclado), pero aún así, bloqueo mi PC para que alguien pueda No te limites a caminar e interferir con ello. Una vez que bloquea la PC, el escritorio está inactivo, por lo que la automatización deja de funcionar. Un problema similar ocurre si se activa el protector de pantalla: los interruptores del escritorio y falla la automatización.
Una solución es utilizar dos PC: llamémoslos Principal y Prueba: desde Principal, abra un cliente de servicios de terminal remoto en la máquina de Prueba, y luego ejecute la prueba automatizada en la máquina de prueba, pero desde una ventana de cliente de servicios de terminal en la Principal máquina. Ahora la parte interesante: puede minimizar la ventana de TSC, o incluso bloquear la máquina principal (o dejar que el protector de pantalla se active), y esa sesión virtual continuará funcionando, pensando que todavía está activa, es solo que nadie la está pagando. atención. Esta es una forma de crear una sesión "conectada" con un escritorio activo, pero una con la que nadie puede interferir, porque está protegido detrás del escritorio bloqueado de la máquina principal.
He estado trabajando en la automatización y monitorización de ventanas.
¿Qué sucede exactamente cuando bloqueo la pantalla de una máquina con Windows?
Estoy trabajando con Windows 7 en este momento, ¿hay grandes diferencias en el comportamiento si cambio a Vista o las versiones del servidor? ¿Todavía hay un escritorio al que se puede acceder a través de la API? Sé que todavía puedo enviar pulsaciones de teclas y clics del mouse a ventanas específicas (a través de ControlSend y ControlClick ), pero no parece haber un "escritorio" en sí.
¿Podría alguien arrojar algo de luz sobre todo esto o señalarme una fuente legible donde pueda obtener una visión general sobre el tema?
No conozco los detalles, pero creo que la pantalla de bloqueo constituye un "escritorio" separado y tal vez también una "estación de ventana" separada (como entiendo que una estación de ventana es simplemente un contenedor para escritorios). La sección de MSDN sobre estaciones de ventana debería ser útil: http://msdn.microsoft.com/en-us/library/windows/desktop/ms687098%28v=vs.85%29.aspx
Para acceder a un escritorio, deberá usar las ventanas comunes de Windows desde un hilo que se encuentra en ese escritorio. SetThreadDesktop probablemente sería la forma más fácil de hacerlo en C, siempre que el escritorio no esté en una estación de ventana diferente.
Desafortunadamente, esto ya es difícil para una aplicación privilegiada regular, y el uso de AutoHotkey lo complica aún más. Debido a que no tiene control sobre los subprocesos o sobre el proceso de inicialización, probablemente tendrá que crear un nuevo proceso en el otro escritorio (puede hacerlo usando la API CreateProcess, que parece tener un envoltorio disponible para AHK en el que puede proporcione un nombre de escritorio: http://www.autohotkey.com/forum/topic1952.html ). Su proceso necesitará privilegios especiales para hacer esto; No estoy seguro de que incluso correr como Administrador sea suficiente.