微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决所有已安装的 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 可能是所有可用选项中最不精确的。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。