Windows 8/10 API 检测挂起的进程

Posted

技术标签:

【中文标题】Windows 8/10 API 检测挂起的进程【英文标题】:Windows 8/10 API Detect suspended process 【发布时间】:2018-05-03 20:55:25 【问题描述】:

Windows 8/10 中的 UWP(或“Metro”)应用在不在前台时经常被挂起。处于这种状态的应用会继续存在,但不再消耗 CPU 时间。引入此更改似乎是为了提高平板电脑和手机等低功耗/存储设备的性能。

请问,在这种状态下检测应用程序最优雅、最简单的方法是什么?

目前我可以看到两种可能的解决方案:

    调用 NtQuerySystemInformation() 并枚举每个进程和每个线程。如果所有线程都处于挂起状态,则进程被“挂起”。这种方法需要大量代码,关键是 NtQuerySystemInformation() 只是半文档化的,可以在未来的操作系统中删除。 NtQueryInformationProcess() 也可以提供解决相同问题的方法。

    调用 GetProcessTimes() 并记录每个进程的计数器。等待一段时间(分钟)并再次检查这些。如果进程计数器未更改,则假定进程已暂停。这是一个 hack,我可能会因为想到它而被击落。

吉姆

【问题讨论】:

github.com/processhacker/processhacker/blob/… 【参考方案1】:

第二个 (GetProcessTimes() ... 等待 ... 并再次检查这些。 如果进程计数器没有更改,则假定进程已暂停) 不太可靠。 如果进程正在等待输入(例如,键盘、鼠标或网络) 并且没有得到任何东西,它将使用很少的 CPU 时间 并且似乎会被这种方法暂停。

【讨论】:

以上是关于Windows 8/10 API 检测挂起的进程的主要内容,如果未能解决你的问题,请参考以下文章

如何检测 Ansible playbook 在执行期间挂起的原因

如何使可能挂起的分叉进程超时?

如何在 Linux 上检测挂起的系统关闭?

带有 QSharedMemory 的 IPC 和如果进程之一挂起的风险

进程的阻塞和挂起的区别

进程的阻塞和挂起的区别