最近使用golang开发windows服务,需要获取idle time,由于资料比较少,在此记录,代码如下:
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
}