gpt4 book ai didi

winapi - 使用 Golang 获取 Windows 空闲时间(GetLastInputInfo 或类似)

转载 作者:IT老高 更新时间:2023-10-28 13:09:40 25 4
gpt4 key购买 nike

有没有使用 Go 获取 Windows 系统空闲时间的示例或方法?
我一直在查看 Golang 站点上的文档,但我想我错过了如何访问(和使用)API 来获取系统信息,包括空闲时间。

最佳答案

Go 的网站经过硬编码以显示 Linux 上标准库包的文档。你需要自己获取 godoc 并运行它:

go get golang.org/x/tools/cmd/godoc
godoc --http=:6060

然后在您的网络浏览器中打开 http://127.0.0.1:6060/

值得注意的是 syscall 包,它提供了用于访问 DLL 中的函数的工具,包括 UTF-16 帮助程序和回调生成函数。

对 Go 树进行快速递归搜索表明它没有专门用于 GetLastInputInfo() 的 API,因此除非我遗漏了什么,否则您应该能够调用该函数直接从 DLL 获取:

user32 := syscall.MustLoadDLL("user32.dll") // or NewLazyDLL() to defer loading
getLastInputInfo := user32.MustFindProc("GetLastInputInfo") // or NewProc() if you used NewLazyDLL()
// or you can handle the errors in the above if you want to provide some alternative
r1, _, err := getLastInputInfo.Call(uintptr(arg))
// err will always be non-nil; you need to check r1 (the return value)
if r1 == 0 { // in this case
panic("error getting last input info: " + err.Error())
}

您的案例涉及结构。据我所知,您可以重新创建平面结构(保持字段顺序相同),但您必须将原始中的任何 int 字段转换为 int32,否则为 things will break on 64-bit Windows .咨询Windows Data Types page on MSDN对于适当的类型等价物。在你的情况下,这将是

var lastInputInfo struct {
cbSize uint32
dwTime uint32
}

因为这(就像 Windows API 中的许多结构一样)有一个 cbSize 字段,要求您使用结构的大小对其进行初始化,我们也必须这样做:

lastInputInfo.cbSize = uint32(unsafe.Sizeof(lastInputInfo))

现在我们只需将指向该 lastInputInfo 变量的指针传递给函数:

r1, _, err := getLastInputInfo.Call(
uintptr(unsafe.Pointer(&lastInputInfo)))

记得导入 syscallunsafe

DLL/LazyDLL.Call() 的所有参数都是 uintptrr1 返回也是如此。 _ 返回从不在 Windows 上使用(它与使用的 ABI 有关)。


由于我介绍了在 Go 中使用 Windows API 所需了解的大部分内容,而这些内容是通过阅读 syscall 文档无法收集到的,我还要说(这与上面的问题)如果一个函数同时有ANSI和Unicode版本,你应该使用Unicode版本(W后缀)和包syscall中的UTF-16转换函数最好的结果。

我认为这就是您(或任何人)在 Go 程序中使用 Windows API 所需的所有信息。

关于winapi - 使用 Golang 获取 Windows 空闲时间(GetLastInputInfo 或类似),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22949444/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com