from win32gui import GetWindowText, GetForegroundWindow
import time
time.sleep(5)
# lock the system or open the application for a check
print(GetWindowText(GetForegroundWindow()))
def register(handle: HWND) -> bool:
"""
@param handle: handle for your message window.
When registered, Windows Messages related to session event changes will be
sent to the message window.
@returns: True is session tracking is successfully registered.
Blocks until Windows accepts session tracking registration.
Every call to this function must be paired with a call to unregister.
https://learn.microsoft.com/en-us/windows/win32/api/wtsapi32/nf-wtsapi32-wtsregistersessionnotification
"""
# OpenEvent handle must be closed with CloseHandle.
eventObjectHandle: HANDLE = ctypes.windll.kernel32.OpenEventW(
# Blocks until WTS session tracking can be registered.
# Windows needs time for the WTS session tracking service to initialize.
# must ensure that the WTS session tracking service is ready before trying to register
SYNCHRONIZE, # DWORD dwDesiredAccess
False, # BOOL bInheritHandle - sub-processes do not need to inherit this handle
# According to the docs, when the Global\TermSrvReadyEvent global event is set,
# all dependent services have started and WTSRegisterSessionNotification can be successfully called.
# https://learn.microsoft.com/en-us/windows/win32/api/wtsapi32/nf-wtsapi32-wtsregistersessionnotification#remarks
"Global\\TermSrvReadyEvent" # LPCWSTR lpName - The name of the event object.
)
if not eventObjectHandle:
error = ctypes.WinError()
log.error("Unexpected error waiting to register session tracking.")
return False
registrationSuccess = ctypes.windll.wtsapi32.WTSRegisterSessionNotification(handle, NOTIFY_FOR_THIS_SESSION)
ctypes.windll.kernel32.CloseHandle(eventObjectHandle)
if registrationSuccess:
log.debug("Registered session tracking")
else:
error = ctypes.WinError()
if error.errno == RPC_S_INVALID_BINDING:
log.error(
"WTS registration failed. "
"Waited successfully on TermSrvReadyEvent to ensure that WTS is ready to allow registration. "
"Cause of failure unknown. "
)
else:
log.error("Unexpected error registering session tracking.")
return registrationSuccess
def unregister(handle: HWND) -> None:
"""
This function must be called once for every call to register.
If unregistration fails, session tracking may not work properly until the session can be unregistered in a new instance.
https://learn.microsoft.com/en-us/windows/win32/api/wtsapi32/nf-wtsapi32-wtsunregistersessionnotification
"""
if ctypes.windll.wtsapi32.WTSUnRegisterSessionNotification(handle):
log.debug("Unregistered session tracking")
else:
error = ctypes.WinError()
log.error("Unexpected error unregistering session tracking.")
在 windows 的Window Message行程常式中,当您收到WM_WTSSESSION_CHANGE时,行程WTS_SESSION_UNLOCK和WTS_SESSION_LOCK事件,以追踪锁定的Windows状态。 类似的答案可能会给予更多关于handling windows messages的内容。
9条答案
按热度按时间2vuwiymt1#
这段代码今天在四台不同的Windows 7和10机器上运行,请尝试类似的操作:
编辑:还有,这一个今天的作品:
csga3l582#
我发现了一个查看Windows 10是否被锁定的方法,就是使用
psutil
查看正在运行的进程。然后搜索LogonUI.exe
是否正在运行。这个进程只在用户有一个锁定的会话时运行。注意:如果您使用“切换用户”,此进程将显示为正在运行,此解决方法将不起作用。Windows实际上会产生多个
LogonUI.exe
进程,每个登录的锁定用户一个。只有当一次只有一个用户登录时,此方法才有用。tjrkku2a3#
类似这样的东西应该可以做到这一点:
bkkx9g8r4#
你可以把窗口放在最上面,当会话被锁定时,函数返回0。
v09wglhw5#
从
LockWorkStation()
documentation:您无法调用任何函数来确定工作站是否已锁定。
不是Python的限制,而是系统本身。
5kgi1eie6#
我在Windows 10 Pro上的工作方式是获取前景窗口:
锁定时,返回
Windows Default Lock Screen
作为窗口标题,C:\Windows\SystemApp\Microsoft.LockApp_<randomcharacters>\LockApp.exe
作为文件名。但是,正如James Koss所提到的,如果用户正在键入密码,GetForeGroundWindow将返回0。还有其他(非锁定)情况,其中当前ForegroundWindow为0,因此不能依赖于此。
siotufzp7#
嗨,检查这4行..
返回屏幕上的应用程序名称。如果窗口已锁定,则返回字符串- Windows默认锁定屏幕。
uqjltbpv8#
根据@Stardidi的回答,这对我很有效(Windows 10专业版):
xnifntxz9#
这里没有简单的答案,但您可以通过会话跟踪来实现这一点。
从LockWorkStation() documentation:
您无法呼叫任何函数来判断工作站是否已锁定。若要在使用者登入时接收通知,请使用WTSRegisterSessionNotification函数来接收WM_WTSSESSION_CHANGE消息。您可以使用工作阶段通知来追踪桌面状态,以便了解是否可以与使用者互动。
开始将会话通知注册到程序的窗口。
在 windows 的Window Message行程常式中,当您收到
WM_WTSSESSION_CHANGE
时,行程WTS_SESSION_UNLOCK
和WTS_SESSION_LOCK
事件,以追踪锁定的Windows状态。类似的答案可能会给予更多关于handling windows messages的内容。