繁体   English   中英

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

[英]Total time in foreground for all installed windows application

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

我找到的最接近的解决方案 - https://docs.microsoft.com/en-us/dotnet/api/system.diagnostics.process.totalprocessortime?view=net-5.0但这个解决方案是每个进程,不考虑进程 state(背景/前景)

听起来您想监控最终用户应用程序的使用。 为此,我建议使用全局钩子,但是,.Net 中的全局钩子要么非常有限,要么被阻止。 这是一个旧项目,它使用来自.Net的 C++ DLL 创建实际的钩子: https://www.code-project.com/ks-in-netglobal

我不认为当 Application / Window 变为活动时存在挂钩。 所以你可能想要做的是添加一个鼠标钩子,然后使用类似http://pinvoke.net/default.aspx/user32/GetForegroundWindow.html的东西来获取当前活动前景的句柄 ZC1B29686A3837D

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

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

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


可以查看的另一种方法是我发现的这篇文章: https://www.c-sharpcorner.com/article/active-application-watcher-in-net-using-windows-forms/

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

如果您将 go 用于后者,我建议您将 Timer 控件换成其他东西。 System.Windows.Forms.Timer class 不精确 - 所以它可能每半秒触发一次,但它可能不会 - 特别是如果 CPU 使用率飙升导致另一个应用程序。 当然,其他类型的定时器也会出现 CPU 使用率峰值的问题,但 Forms.Timer 可能是所有可用选项中精度最低的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM