识别Windows机器上的空闲状态

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

那么我们如何才能确定系统是否真的闲置呢?

有谁知道Window的“闲置”定义是什么? 必须是阈值的组合 – 比如cpu utilless于5%,磁盘使用率less于3%等 – 以及用户input参数…任何人都知道确切的定义?

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

Windows应用程序中总是有消息(用户生成和系统生成),但是在典型的应用程序中您会看到频繁的短暂空闲时间。 当鼠标移动到应用程序中的某个窗口上时,由于鼠标活动会产生大量的消息活动,所以空闲时间将下降到接近于零,直到鼠标停止移动。

所以,在你的Windows应用程序的消息循环中,如果你正在使用GetMessage,你将需要改变你的循环来使用PeekMessage。 GetMessage在消息队列为空时阻塞,直到消息到达。 如果队列中有消息,则PeekMessage返回true,否则返回false。 使用标志,您可以使PeekMessage在相同的调用中获取消息。

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

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

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

没有“闲置”的真实定义。 这将是任何你想要的。