在Python 3中,如何判断Windows是否被锁定?

时间:2015-12-29 16:03:12

标签: python windows python-3.x

如何检查Windows操作系统工作站是否已锁定? (例如,在Ctrl + Alt + Del之后选择Win + L或选择锁定选项。)

我想要ctypes.windll.user32.isWorkstationLocked()

8 个答案:

答案 0 :(得分:3)

您可以将窗口置于顶部,当会话锁定时,该函数返回0。

import ctypes
user32 = ctypes.windll.User32

def isLocked():
    return user32.GetForegroundWindow() == 0

答案 1 :(得分:2)

这样的事情可以解决问题:

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)

答案 2 :(得分:2)

此代码今天在四台不同的Windows 7和10计算机上为我工作,请尝试类似的操作:

import ctypes
import time
user32 = ctypes.windll.User32
time.sleep(5)
#
#print(user32.GetForegroundWindow())
#
if (user32.GetForegroundWindow() % 10 == 0): print('Locked')
# 10553666 - return code for unlocked workstation1
# 0 - return code for locked workstation1
#
# 132782 - return code for unlocked workstation2
# 67370 -  return code for locked workstation2
#
# 3216806 - return code for unlocked workstation3
# 1901390 - return code for locked workstation3
#
# 197944 - return code for unlocked workstation4
# 0 -  return code for locked workstation4
#
else: print('Unlocked')

编辑:而且,今天该软件可以使用:

import subprocess
import time
time.sleep(5)
process_name='LogonUI.exe'
callall='TASKLIST'
outputall=subprocess.check_output(callall)
outputstringall=str(outputall)
if process_name in outputstringall:
    print("Locked.")
else: 
    print("Unlocked.")

答案 3 :(得分:0)

来自LockWorkStation() documentation

  

您无法调用以确定工作站是否已锁定。

不是Python限制,而是系统本身。

答案 4 :(得分:0)

在Windows 10 Pro上对我有用的是获取前台窗口:

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)

锁定后,此返回Windows Default Lock Screen作为窗口标题,返回C:\Windows\SystemApp\Microsoft.LockApp_<randomcharacters>\LockApp.exe作为文件名。

但是,正如James Koss所述,如果用户输入密码,GetForeGroundWindow将返回0。在其他(非锁定)情况下,当前的ForegroundWindow为0,因此无法依赖。

答案 5 :(得分:0)

我发现一个漏洞,想知道Windows 10是否被锁定,是使用psutil查看正在运行的进程。然后,您搜索以查看LogonUI.exe是否正在运行。仅当用户具有锁定的会话时,此过程才会运行。

注意:如果使用切换用户,则此过程将显示为正在运行,并且此解决方法将不起作用。 Windows实际上产生了多个LogonUI.exe进程,每个登录的锁定用户一个。仅在一次只有一个人登录的情况下有用。

SELECT try(some_array[2]) FROM ...

答案 6 :(得分:0)

基于@Stardidi答案,这对我有效(Windows 10 Pro):

import time
import win32gui
import win32api
import win32con
import win32process

while True:
    time.sleep(1)
    _, pid = win32process.GetWindowThreadProcessId(win32gui.GetForegroundWindow())

    try:
        handle = win32api.OpenProcess(win32con.PROCESS_ALL_ACCESS, False, pid)
        filename = win32process.GetModuleFileNameEx(handle, 0)
    except Exception as _e:
        filename = "LockApp.exe"
        del _e

    current_status = "locked" if "LockApp" in filename else "unlocked"

答案 7 :(得分:0)

您好,请检查这4行。

返回屏幕上的应用程序名称。如果窗口被锁定,则返回字符串-Windows默认锁定屏幕。

from win32gui import GetWindowText, GetForegroundWindow
import time
time.sleep(5)
# lock the system or open the application for a check
print(GetWindowText(GetForegroundWindow()))