簡體   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