当前位置: 首页 > 面试题库 >

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

倪培
2023-03-14
问题内容

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


问题答案:

Go的网站进行了硬编码,以显示Linux上标准库软件包的文档。您将需要获取godoc并自己运行它:

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

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

值得注意的是package 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,否则在64位Windows上会中断。有关适当的类型等效项,请查阅MSDN上的Windows数据类型页。就您而言,这将是

var lastInputInfo struct {
    cbSize uint32
    dwTime uint32
}

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

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

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

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

并且只记得导入syscallunsafe

所有的参数传递给DLL/LazyDLL.Call()uintptr,因为是r1回报。_Windows永远不会使用该返回值(这与所使用的ABI有关)。

由于我遍历了您在Go中使用Windows
API所需了解的大部分知识,因此您无法从阅读syscall文档中了解到这些信息,因此我也要说(这与上面的问题无关),如果一个函数同时具有ANSI和Unicode版本,则应W在程序包中使用Unicode版本(后缀)和UTF-16转换函数,以syscall获得最佳效果。

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



 类似资料:
  • 函数功能:获得设备内存总量 函数方法 free = device.getFreeMemory() 返回值 类型 说明 free string 设备空闲内存,单位:字节 函数用例 free = device.getFreeMemory() dialog(free,5000) 注意事项 目前积木编程函数和触动精灵函数不通用,请仔细查看本手册,此手册中函数仅支持积木编程,不支持触动精灵,同理请勿将触动

  • 我想实现什么: 用户不活动3分钟后,我想显示一个新的活动。 研究: 我确实在Stackoverflow上查找了这个问题,我发现了一些提示,说明如何使用后台线程执行此操作,创建注册最后一次触摸的基本活动等。 问题: 如果我有超过 20 个活动,则表示 20 个活动,并且我不想从基本活动扩展所有活动。这意味着每次我创建一个新活动时,我都需要扩展这个基础活动,如果我的活动已经从其他一些基础活动扩展,这可

  • 文件系统负责将空闲块分配给文件,因此它必须跟踪磁盘中存在的所有空闲块。 主要有两种方法,使用它们管理磁盘中的空闲块。 1. 位向量 在这种方法中,空闲空间列表被实现为位图向量。 它包含每个位代表每个块的位数。 如果该块为空,则该位为1,否则为0。最初,所有块都是空的,因此位图向量中的每个位都包含1。 随着空间分配的进行,文件系统开始为文件分配块并将各个位设置为。 2. 链接列表 这是空闲空间管理的

  • 本文向大家介绍使用什么命令查看磁盘使用空间? 空闲空间呢?相关面试题,主要包含被问及使用什么命令查看磁盘使用空间? 空闲空间呢?时的应答技巧和注意事项,需要的朋友参考一下 答案: df -hl 文件系统 容量 已用 可用 已用% 挂载点 Filesystem Size Used Avail Use% Mounted on /dev/hda2 45G 19G 24G 44% / /dev/hda1

  • 我尝试在我的程序中使用G1GC。该程序可在各种内存大小的机器上使用:1Gb内存的VPS(最小)、8Gb内存的桌面、32Gb内存的DS(最大)。我注意到G1GC没有保留更多的内存,即使有很多可用内存(例如,G1GC在我的机器上保留的内存不超过3Gb,总共8Gb/4Gb可用) 另外,我想要一个通用的解决方案。我无法为每种类型的机器创建单独的版本或单独的运行脚本。

  • 在最新的版本(1.0.0-pre1)中,gRPC 引入了 Channel 的空闲模式(idle mode)。 工作方式(初步) 在 InUseStateAggregator 中,控制 Channel (准备)进入空闲模式和退出空闲模式: final InUseStateAggregator<Object> inUseStateAggregator = new InUseStateAggregato