Можно ли получить имя процесса текущего активного окна?

326
10 июля 2017, 14:44

Я хочу написать для себя простенький сервис для отслеживания того, с какими программами я работаю в течении дня и сколько времени на них трачу.

Как я представляю работу такой программы? У меня на ПК в фоне должна работать программа, которая будет мониторить текущее активное окно и то, сколько оно активно. На сервер будут отправляться данные такого типа:

Процесс       Был активен
phpstrom.exe  3600

Ну и далее эти данные будут выводиться в виде графиков.

Вопрос - можно ли реализовать это на C#? К сожалению, у меня нет опыта разработки софта под Windows, по этому, я понятия не имею, что мне нужно использовать. Не могли бы вы подсказать технологию и пример того, как можно получить имя процесса текущего активного окна?

Answer 1

То что вы хотите можно сделать с использованием winapi функций. Вам понадобятся две: GetForegroundWindow, GetWindowThreadProcessId

По ссылкам можно найти описание параметров функций и в какой DLL-библиотеке они находятся. Их описание нужно объявить в c# следующим образом:

 [DllImport("user32.dll")]
 public static extern IntPtr GetForegroundWindow();
 [DllImport("user32.dll")]
 public static extern UInt32 GetWindowThreadProcessId(IntPtr hwnd, ref Int32 pid);

После этого ими можно пользоваться. Первая функция получает дескриптор активного окна, вторая - получает идентификатор процесса по дескриптору окна. В пространстве System.Diagnostics есть класс Process, с помощью которого можно получить данные о процессе. Ну как минимум заголовок окна. Вот пример использования:

IntPtr h = GetForegroundWindow();
int pid = 0;
GetWindowThreadProcessId(h, ref pid);
Process p = Process.GetProcessById(pid);
Console.Write("pid: {0}; window: {1}", pid, p.MainWindowTitle);
Answer 2

Конкретно такой задачи я не решал, но судя по всему вам нужно:
GetForegroundWindow() - для получения хэндла активного окна;
GetWindowThreadProcessId() - для получения PIDа по хэндлу;
GetProcessImageFileName() - для получения имени бинарника по хэндлу процесса.

READ ALSO
C# Изменить содержимое тега textarea

C# Изменить содержимое тега textarea

(C#) Собственно пользуюсь WebBrowser в WindowsFormСпокойно заполнял данные форм на странице пока не дошел до этого:

267
Что посоветуете для захвата видео с вебкамеры?

Что посоветуете для захвата видео с вебкамеры?

В моём проекте требуется реализация захвата видео с вебкамерыКакую библиотеку либо WinApi посоветуете для этого использовать?

251
Центральное значение по оси X

Центральное значение по оси X

Есть график (статичный):

427
Создать массив диапазона чисел

Создать массив диапазона чисел

Нужно создать строку в которой будут числа 12883, 12892-12926

336