Как перебирать не отвечающие программы в окнах? - PullRequest
3 голосов
/ 22 февраля 2010

Я создаю приложение, которое отслеживает выбранную группу программ и перезапускает их при необходимости. С этой группой программ, если что-то «пошло не так» (т. Е. Их нужно перезапустить), программа отобразится в диспетчере задач как «не отвечает».

Есть ли способ перебирать не отвечающие программы в Windows, используя API? Или, в качестве альтернативы, если у меня есть идентификатор процесса или дескриптор окна, могу ли я спросить, отзывчиво оно или нет?

Ответы [ 3 ]

5 голосов
/ 22 февраля 2010

Я думаю это - это то, что вы ищете.

Re действительный комментарий, что-то вроде:

Process[] processes = Process.GetProcessesByName("your process name");
if(!processes[0].Responding)
 // kill it or do something
4 голосов
/ 22 февраля 2010

Во-первых, вы должны пройти через все окна верхнего уровня.Сделайте это, позвонив в Win32 EnumWindows.Эта функция требует подпрограммы обратного вызова, поэтому ее сложно объяснить на C #.В любом случае, проверьте документацию.

Затем на каждой итерации вызывайте функцию ниже, передавая дескриптор окна:

[DllExport("user32.dll")]
static bool IsHungAppWindow(IntPtr theWndHandle);

Вызов этой функции в окне должен возвращать true для окна без ответа,Затем получите идентификатор процесса, позвонив по номеру GetWindowThreadProcessId.

. Затем получите ссылку на процесс и выйдите из него:

Process aPrc = Process.GetProcessById(aPrcID);
aPrc.Kill();
2 голосов
/ 22 февраля 2010

Не отвечающие приложения обнаруживаются путем отправки сообщения приложению и проверки его обработки в течение нескольких секунд. Я не знаю, есть ли вызов API для этого, но это довольно легко реализовать самостоятельно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...