In Python 3, how can I tell if Windows is locked?

后端 未结 8 677
小鲜肉
小鲜肉 2021-01-13 11:27

How can I check whether a Windows OS workstation is locked? (e.g. Win+L or choosing the lock option after Ctrl+Alt+Del.)

I want something like ctypes.windll.us

相关标签:
8条回答
  • 2021-01-13 11:58

    This code worked today for me on four different Windows 7 and 10 machines, try something similar:

    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')
    

    Edit: Also, this one works today:

    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.")
    
    0 讨论(0)
  • 2021-01-13 12:02

    From the LockWorkStation() documentation:

    There is no function you can call to determine whether the workstation is locked.

    Not a Python limitation, but the system itself.

    0 讨论(0)
  • 2021-01-13 12:06

    What works for me on Windows 10 Pro is getting the foreground window:

    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)
    

    This returns Windows Default Lock Screen as window title and C:\Windows\SystemApp\Microsoft.LockApp_<randomcharacters>\LockApp.exe as filename when locked.

    However, as James Koss mentioned, GetForeGroundWindow will return 0 if the user is typing their password. There are also other (non-locked) situations where the current ForegroundWindow is 0, so this cannot be relied upon.

    0 讨论(0)
  • 2021-01-13 12:09

    You can get the window on top, when the session is locked, the function return 0.

    import ctypes
    user32 = ctypes.windll.User32
    
    def isLocked():
        return user32.GetForegroundWindow() == 0
    
    0 讨论(0)
  • 2021-01-13 12:13

    Based on @Stardidi answer, this worked for me (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"
    
    0 讨论(0)
  • 2021-01-13 12:17

    Something like this should do the trick:

    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)
    
    0 讨论(0)
提交回复
热议问题