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 }