所有已安装的 Windows 应用程序在前台的总时间

问题描述

如何获得此应用程序在前台花费的总时间(以毫秒为单位)?当在前台时,用户正在积极地与应用程序交互。我每小时都需要它来安装所有 Windows 安装的应用程序。

我找到的最接近的解决方案 - https://docs.microsoft.com/en-us/dotnet/api/system.diagnostics.process.totalprocessortime?view=net-5.0 但是这个解决方案是针对每个进程的,没有考虑进程状态(后台/前台

解决方法

听起来您想监控最终用户应用程序的使用情况。为此,我建议使用全局钩子,但是,.Net 中的全局钩子要么极其有限,要么被阻止。这是一个使用 .Net 中的 C++ DLL 创建实际钩子的旧项目:https://www.codeproject.com/articles/6362/global-system-hooks-in-net

我认为当应用程序/窗口变为活动状态时没有钩子。所以你可能想要做的是添加一个鼠标钩子,然后使用类似 http://pinvoke.net/default.aspx/user32/GetForegroundWindow.html 的东西来获取当前活动前景窗口的句柄。

将该句柄与您检索到的最后一个句柄进行比较。如果不同,请记录开始日期/时间,然后使用其他函数获取有关相关窗口的更多信息(例如标题栏和 exe 名称)。

然后每次检测到更改时,记录结束日期/时间,计算开始/结束时间之间的差异,然后将其放入 Dictionary 中,以跟踪每个 Handle 的总滴答声。

一个警告是 Alt+Tab。您可能还需要一个键盘挂钩。


我发现的这篇文章可以替代检查: https://www.c-sharpcorner.com/article/active-application-watcher-in-net-using-windows-forms/

似乎也在做你想做的事,但它不是鼠标/键盘钩子,它只是有一个定时器,每半秒触发一次,并抓住活动的前景窗口。这种方法的缺点是准确性(当然,即使是钩子也不会达到 100% 精确)。

如果您选择后者,我建议您将 Timer 控件换成其他东西。 System.Windows.Forms.Timer 类并不精确 - 因此它可能每半秒触发一次,但可能不会 - 特别是如果 CPU 使用率因另一个应用程序而激增。当然,其他类型的计时器会遇到 CPU 使用率峰值的问题,但 Forms.Timer 可能是所有可用选项中最不精确的。