【发布时间】:2017-02-01 12:19:55
【问题描述】:
有没有办法自动检查当前用户是否锁定了他的电脑? (通常由Win+L 激活)。我看到的一种 hacky 方法是以某种方式捕获所有组合键,但问题是如何知道用户已经返回?
也许有一些标志可以通过 python 或 windows 终端访问?
编辑:我尝试了这里的代码:Detect when computer is unlocked Windows
它会检测屏幕何时被锁定,但不会在解锁时检测到,它会无限期地继续写入“屏幕仍处于锁定状态”。那么可能是什么问题?我有 Python 3.4、64 位 Win7。
EDIT2:实际上result 对我来说始终是0,即使没有任何锁定,所以实际上它没有检测到任何东西。
import ctypes
user32 = ctypes.windll.User32
OpenDesktop = user32.OpenDesktopA
SwitchDesktop = user32.SwitchDesktop
DESKTOP_SWITCHDESKTOP = 0x0100
hDesktop = OpenDesktop ("default", 0, False, DESKTOP_SWITCHDESKTOP)
result = SwitchDesktop (hDesktop)
print(result)
【问题讨论】:
-
我试过了,只是部分有效。
-
此代码在 Python 3 中不起作用,因为您将 unicode 传递给(所有但已弃用且绝对要避免)[A]NSI API
OpenDesktopA而不是 [W ]ide-character APIOpenDesktopW。它也没有设置restype和argtypes,所以它很容易使Python 崩溃。它不处理错误。它正在泄漏一个手柄。它可能会修改当前输入桌面作为副作用。它使用了ctypes.windll,它容易受到库间冲突的影响,而不是ctypes.WinDLL,因此也没有使用use_last_error=True来保护线程的最后一个错误值。 -
谢谢,使用 OpenDesktopW 使它工作。
-
依赖于安全桌面行为的技术,例如这种技术,在 Windows 10 中是不可靠的。当工作站被锁定时,例如通过
LockWorkStation,它不会立即设置为安全桌面。您必须单击以切换到安全桌面(我不知道为什么),这是提示您输入凭据的地方。最好直接查询终端服务 API 来检查会话是否被锁定——Windows 7 及更高版本支持的查询。