En Python 3, ¿cómo puedo saber si Windows está bloqueado?

¿Cómo puedo verificar si una estación de trabajo con sistema operativo Windows está bloqueada? (por ejemplo, Win + L o elegir la opción de locking después de Ctrl + Alt + Del).

Quiero algo como ctypes.windll.user32.isWorkstationLocked() .

Puede obtener la ventana en la parte superior, cuando la sesión está bloqueada, la función devuelve 0.

 import ctypes user32 = ctypes.windll.User32 def isLocked(): return user32.GetForegroundWindow() == 0 

Algo como esto debería hacer el truco:

 import time import ctypes user32 = ctypes.windll.User32 OpenDesktop = user32.OpenDesktopA SwitchDesktop = user32.SwitchDesktop DESKTOP_SWITCHDESKTOP = 0x0100 while 1: hDesktop = OpenDesktop ("default", 0, False, DESKTOP_SWITCHDESKTOP) result = SwitchDesktop (hDesktop) if result: print "Unlocked" time.sleep (1.0) else: print time.asctime (), "still locked" time.sleep (2) 

De la documentación de LockWorkStation() :

No hay ninguna función a la que pueda llamar para determinar si la estación de trabajo está bloqueada.

No es una limitación de Python, sino el propio sistema.

Lo que me funciona en Windows 10 Pro es obtener la ventana de primer plano:

 whnd = win32gui.GetForegroundWindow() (_, pid) = win32process.GetWindowThreadProcessId(whnd) handle = win32api.OpenProcess(win32con.PROCESS_ALL_ACCESS, False, pid) filename = win32process.GetModuleFileNameEx(handle, 0) window_text = win32gui.GetWindowText(whnd) 

Esto devuelve la Windows Default Lock Screen como título de la ventana y C:\Windows\SystemApp\Microsoft.LockApp_\LockApp.exe como nombre de archivo cuando se bloquea.

Sin embargo, como mencionó James Koss, GetForeGroundWindow devolverá 0 si el usuario está escribiendo su contraseña. También hay otras situaciones (no bloqueadas) donde el actual ForegroundWindow es 0, por lo que no se puede confiar en ello.