posts - 3,  comments - 0,  views - 2071
< 2025年4月 >
30 31 1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 1 2 3
4 5 6 7 8 9 10

最近使用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
}
posted on   一头野兽  阅读(985)  评论(0)    收藏  举报
点击右上角即可分享
微信分享提示