package osapi import ( "syscall" "unsafe" "github.com/lxn/win" ) // last input info var lastInputInfo struct { cbSize uint32 dwTime uint32 } // get idle time func GetIdleTime() int64 { lastInputInfo.cbSize = uint32(unsafe.Sizeof(lastInputInfo)) // load user32.dll , Kernel32.dll only once user32 := win.MustLoadLibrary("user32.dll") kernal32 := win.MustLoadLibrary("Kernel32.dll") getLastInputInfo := win.MustGetProcAddress(user32, "GetLastInputInfo") getTickCount := win.MustGetProcAddress(kernal32, "GetTickCount") tickCount, _, _ := syscall.Syscall(getTickCount, 0, 0, 0, 0) res, _, _ := syscall.Syscall(getLastInputInfo, 1, uintptr(unsafe.Pointer(&lastInputInfo)), 0, 0) if res == 0 { panic("get idle time error") } result := int64((int64(tickCount) - int64(lastInputInfo.dwTime)) / 1000) var idleTime int64 = 0 if result > 0 { idleTime = result } return idleTime }