我知道 GetLastInputInfo 方法,但它只会给我自上次用户输入(键盘或鼠标)以来的持续时间。如果上次收到用户输入是在 10 分钟前,那并不意味着系统已经闲置了 10 分钟 - 扫描、下载、电影 - 有很多原因。
那么如何判断系统是否真正空闲呢?
有谁知道Window对“空闲”的定义是什么? 必须是阈值的组合 - 例如低于 5% 的 cpu 利用率、低于 3% 的磁盘利用率等 - 以及用户输入参数...有人知道确切的定义吗?
最佳答案
由于大多数 Windows 应用程序都是 UI 驱动的,而 Windows UI 是通过从消息队列中获取消息来驱动的,因此定义应用程序何时“空闲”的一种常见方法是它的消息队列中没有消息。
Windows 应用程序中总是有消息飞来飞去(用户生成的和系统生成的),但您会在典型的应用程序中看到频繁的短暂空闲期。当鼠标在您的应用程序的窗口上移动时,您的空闲时间将下降到接近零,直到鼠标停止移动,因为鼠标事件会产生大量消息事件。
因此,在您的 Windows 应用程序的消息循环中,如果您当前正在使用 GetMessage,则需要更改您的循环以改为使用 PeekMessage。 GetMessage 在消息队列为空时阻塞,直到消息到达。如果队列中有消息,PeekMessage 返回 true,如果没有,则返回 false。使用标志,您可以使 PeekMessage 在同一个调用中获取消息。
当 PeekMessage 返回 false 时,您可以将执行转移到“空闲”任务,而不是等待下一条消息。
在 WinForms 应用程序中,使用 Application.Idle event
不过不要在空闲代码中做太多事情,否则您的 UI 会感觉迟钝,因为消息没有得到快速处理。过度使用空闲周期还会使您的 CPU 过热并耗尽笔记本电脑的电池。
关于.net - 识别 Windows 机器上的空闲状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1702646/