识别Windows机器上的空闲状态

时间:2009-11-09 17:51:33

标签: .net windows idle-processing

我知道GetLastInputInfo方法,但这只会给我自上次用户输入以来的持续时间 - 键盘或鼠标。如果用户输入是在10分钟前最后一次收到的,那么这并不意味着系统已经闲置了10分钟 - 扫描,下载,电影 - 很多原因。

那么我们如何确定系统是否真正空闲?

有谁知道Window对“空闲”的定义是什么? 必须是阈值的组合 - 比如小于5%的cpu util,小于3%的磁盘使用率等 - 以及用户输入参数......谁知道确切的定义?

2 个答案:

答案 0 :(得分:2)

没有“空闲”的真正定义。这将是你想要的任何东西。

答案 1 :(得分:2)

由于大多数Windows应用程序都是UI驱动的,并且Windows UI是通过从消息队列中提取消息来驱动的,因此定义应用程序何时“空闲”的一种常用方法是在其消息队列中没有消息。

Windows应用程序中始终存在消息(用户生成和系统生成),但您会在典型的应用程序中看到频繁的短暂空闲时段​​。当鼠标在应用程序中的窗口上移动时,您的空闲时间将降至接近零,直到鼠标停止移动,因为鼠标活动会产生大量的消息活动。

因此,在Windows应用程序的消息循环中,如果您当前正在使用GetMessage,则需要更改循环以使用PeekMessage。消息队列为空时,GetMessage会阻塞,直到消息到达。如果队列中有消息,则PeekMessage返回true,否则返回false。使用标志,您可以使PeekMessage在同一个调用中获取消息。

当PeekMessage返回false时,您可以将执行转移到“空闲”任务,而不是等待下一条消息。

在WinForms应用程序中,使用Application.Idle event

不要在你的空闲代码中做太多,否则你的UI会感觉迟钝,因为消息没有被快速处理。过度使用空闲周期也会使CPU运行热,并耗尽笔记本电池电量。