Похоже, вы хотите отслеживать использование приложения конечным пользователем. Для этого я бы рекомендовал глобальный хук, однако глобальные хуки в .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