
От идеи до рабочего приложения: создание ProcessTimeWatcher на C# и WPF
yanchino 10 минут назад От идеи до рабочего приложения: создание ProcessTimeWatcher на C# и WPF Средний 4 мин 249 C# * .NET * Windows * Open source * Кейс ВведениеОднажды я заметил, что большая часть рабочего/учебного...
<5 — 2026'da uzaya kaç SpaceX Starship fırlatması ulaşacak?
В сфере искусственного интеллекта произошло заметное событие. yanchino 10 минут назад От идеи до рабочего приложения: создание ProcessTimeWatcher на C# и WPF Средний 4 мин 249 C# * . NET * Windows * Open source * Кейс ВведениеОднажды я заметил, что большая часть рабочего/учебного времени за компьютером проходит незаметно. Кажется, что ты "немного посидел" в IDE, "на пару минут" открыл браузер, а в итоге половина дня куда-то исчезла.
Существующие решения для отслеживания активности есть, но мне было интересно не просто установить готовую программу, а разобраться, как подобный инструмент работает изнутри. Так появился проект ProcessTimeWatcher — небольшое WPF-приложение на C#, которое отслеживает активное окно пользователя и показывает, сколько времени было проведено в разных приложениях. В этой статье расскажу, как устроено приложение, какие проблемы возникли во время разработки и чему удалось научиться.
Технические детали
Идея проектаОсновная задача была простой:Определять, какое приложение сейчас находится в фокусе, и считать время его использования. Например:Visual Studio 02:34:12 Google Chrome 01:20:45 Telegram 00:45:10 Spotify 00:30:05Но за этой простой задачей скрывается несколько проблем:Windows не предоставляет готовый удобный список "текущего активного приложения";название процесса не всегда совпадает с названием программы;некоторые процессы нельзя прочитать без дополнительных прав;нужно правильно учитывать время переключения между окнами. Используемые технологииВ проекте используются:C#WPF (.
NET)Windows APIProcess APIXAML для интерфейсаПочему именно WPF? Для небольшого Windows-приложения WPF оказался удобным вариантом:простой интерфейс через XAML;хорошая работа с окнами Windows;возможность использовать нативные возможности платформы;быстрый результат без лишнего количества зависимостей. Как приложение получает активное окноГлавная часть программы — определение окна, которое сейчас находится в фокусе.
Для этого используются функции Windows API: private static extern IntPtr GetForegroundWindow(); private static extern uint GetWindowThreadProcessId(IntPtr hWnd,out uint processId);Она возвращает дескриптор активного окна. После этого через:GetWindowThreadProcessId()можно получить идентификатор процесса. Примерный алгоритм:Пользователь переключился на приложение | v Получаем активное окно | v Получаем ID процесса | v Получаем информацию о процессе | v Добавляем время активностиПолучение информации о приложенииПервоначально я использовал имя процесса.
Отраслевые последствия
exeНо быстро стало понятно, что этого недостаточно. Пользователь видит не:devenvа:Visual StudioПоэтому пришлось получать дополнительную информацию:process. FileDescriptionОна позволяет получить более привычное название приложения.
Visual StudioПодсчёт времениИзначально время отображалось просто:61 секНо такой вариант быстро стал неудобным. Поэтому формат был изменён:00:01:01где:первые два значения — часы;следующие — минуты;последние — секунды.
Этот прогресс даёт важные сигналы о будущем отрасли, и технологический мир внимательно наблюдает.





