Общее время на переднем плане для всех установленных приложений Windows

Как я могу получить общее время, которое это приложение провело на переднем плане, измеренное в миллисекундах? На переднем плане пользователь активно взаимодействует с приложением. Мне это нужно для всех установленных приложений Windows каждый час.

Самое близкое решение, которое я нашел - https://docs.microsoft.com/en-us/dotnet/api/system.diagnostics.process.totalprocessortime?view=net-5.0 Но это решение для каждого процесса и без учета состояния процесса (фоновый/ передний план)


person Rougher    schedule 22.04.2021    source источник
comment
Вы имели в виду активное время подачи заявки? Если это так, stackoverflow .com/questions/63547309/ это ответ на ваш вопрос.   -  person zia khan    schedule 22.04.2021
comment
Я имею в виду общее время на переднем плане для всех установленных приложений. Как в Android: developer.android.com/reference/android/ приложение/использование/   -  person Rougher    schedule 22.04.2021
comment
На переднем плане пользователь активно взаимодействует с приложением — это не кажется полезным критерием. В буквальном смысле фактическое количество времени, в течение которого пользователь активно взаимодействует, ничтожно мало. Пользовательский ввод требует для обработки лишь крошечных долей процессорного времени; для большинства программ они эффективно простаивают более 90% времени. Зачем вообще мерить? Какую проблему вы на самом деле пытаетесь здесь решить? При этом обратите внимание, что вы можете отслеживать активацию окна (т. е. окно процесса, выведенное на передний план), отмечать время ЦП при активации и...   -  person Peter Duniho    schedule 25.04.2021
comment
... деактивировано, и вычтите, чтобы получить общее время ЦП, используемое в активном состоянии. Неясно, что вы на самом деле подразумеваете под передним планом или активным взаимодействием здесь, но это возможный подход, в зависимости от того, что на самом деле означает ваш вопрос.   -  person Peter Duniho    schedule 25.04.2021
comment
Привет @PeterDuniho, ты прав. Собственно, мне нужно создать отчет со временем, проведенным в каждом приложении в час/день/неделю.   -  person Rougher    schedule 26.04.2021


Ответы (1)


Похоже, вы хотите отслеживать использование приложения конечным пользователем. Для этого я бы рекомендовал глобальный хук, однако глобальные хуки в .Net либо крайне ограничены, либо заблокированы. Вот старый проект, в котором для создания реального хука используется C++ DLL из .Net: https://www.codeproject.com/articles/6362/global-system-hooks-in-net

Я не думаю, что есть крючок, когда приложение/окно становится активным. Итак, вы можете добавить хук мыши, а затем использовать что-то вроде http://pinvoke.net/default.aspx/user32/GetForegroundWindow.html, чтобы получить дескриптор текущего активного окна переднего плана.

Сравните этот дескриптор с последним полученным вами дескриптором. Если отличается, запишите дату/время начала, а затем используйте другие функции, чтобы получить дополнительную информацию о рассматриваемом окне (например, строку заголовка и имя исполняемого файла).

Затем каждый раз, когда вы обнаруживаете изменение, записывайте дату/время окончания, вычисляйте разницу между временем начала и окончания и помещайте это в словарь‹Handle, Long›, который отслеживает общее количество тиков для каждого дескриптора.

Один нюанс — Alt+Tab. Вам также может понадобиться крючок для клавиатуры.


Одной из альтернатив возможной проверке является эта статья, которую я нашел: https://www.c-sharpcorner.com/article/active-application-watcher-in-net-using-windows-forms/

Кажется, он также делает то, что вы хотите, но вместо того, чтобы быть крючком мыши/клавиатуры, у него просто есть таймер, который срабатывает каждые полсекунды и захватывает активное окно переднего плана. Обратной стороной этого подхода является точность (конечно, даже крючок не будет на 100% точным).

Если вы выберете последнее, я бы порекомендовал заменить элемент управления Timer на что-то другое. Класс System.Windows.Forms.Timer не является точным, поэтому он может срабатывать каждые полсекунды, а может и нет, особенно если пики использования ЦП вызваны другим приложением. Конечно, другие типы таймеров будут иметь проблемы с пиками использования ЦП, но Forms.Timer, вероятно, наименее точный из всех доступных вариантов.

person B.O.B.    schedule 27.04.2021
comment
... если вы пытаетесь что-то создать, потому что руководство хочет отслеживать поведение конечных пользователей (старший брат), может быть, лучше просто купить и заплатить за приложение старшего брата. Мне нечего порекомендовать, и это просто случайный вариант, который я нашел в Google: microfocus.com/en-us/products/end-user-monitoring/overview ‹ — что-то в этом роде. Может быть намного дешевле / меньше головной боли в долгосрочной перспективе, чтобы купить что-то по сравнению с написанием собственными силами. Конечно, все это при условии, что вы создаете что-то для внутреннего использования, а не пытаетесь создать свой собственный продукт, чтобы конкурировать с другими приложениями, о которых я упоминал. - person B.O.B.; 27.04.2021
comment
Спасибо за подробный ответ. На самом деле, мое приложение — это служба Windows. Я думаю использовать это решение (stackoverflow.com /questions/17345202/) с таймером (каждую секунду - мне достаточно точно). Сомневаюсь только в нагрузке на клиентскую машину. Что вы думаете? - person Rougher; 28.04.2021