package osapi
import (
    "syscall"
    "unsafe"
    "github.com/lxn/win"
)
const (
    DESKTOP_SWITCHDESKTOP = 0x0100 // The access to the desktop
)
// get desktop locked status
func ScreenIsLocked() bool {
    // load user32.dll only once
    user32 := win.MustLoadLibrary("user32.dll")
    openDesktop := win.MustGetProcAddress(user32, "OpenDesktopW")
    closeDesktop := win.MustGetProcAddress(user32, "CloseDesktop")
    switchDesktop := win.MustGetProcAddress(user32, "SwitchDesktop")
    var lpdzDesktopPtr uintptr = uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr("Default"))) //string
    var dwFloatsPtr uintptr = 0                                                               //uint32
    var fInheritPtr uintptr = 0                                                               //boolean
    var dwDesiredAccessPtr uintptr = uintptr(DESKTOP_SWITCHDESKTOP)                           //uint32
    r1, _, _ := syscall.Syscall6(openDesktop, 4, lpdzDesktopPtr, dwFloatsPtr, fInheritPtr, dwDesiredAccessPtr, 0, 0)
    if r1 == 0 {
        panic("get desktop locked status error")
    }
    res, _, _ := syscall.Syscall(switchDesktop, 1, r1, 0, 0)
    // clean up
    syscall.Syscall(closeDesktop, 1, r1, 0, 0)
    return res != 1
}