Как диспетчер задач убивает мою программу? - PullRequest
8 голосов
/ 28 февраля 2012

У меня есть эта программа MFC, которая, когда я убиваю ее с помощью диспетчера задач, получает исключение для моей программы, а затем она вылетает.

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

Я понимаю, что существует несколько методов, которые диспетчер задач использует для остановки процесса.

1) На вкладке приложений кто-то сказал мне, что отправляет сообщение WM_CLOSE в главное видимое окно моего приложения. И если мое приложение не закрывается через несколько секунд, диспетчер задач обнаруживает, что оно не отвечает, и использует TerminateProcess ( ) на своем процессе.

2) На вкладке процесса кто-то сказал мне, что он использует TerminateProcess () Windows API.

Есть ли другой метод, который использует диспетчер задач?

Прав ли я насчет последних 2 методов?

Заранее спасибо.

Ответы [ 4 ]

8 голосов
/ 28 февраля 2012

Да, оба они верны.Вы должны ответить на WM_CLOSE, чтобы закрыть изящно.Это может происходить откуда угодно, а не только из диспетчера задач (например, выключение).

MFC обычно обрабатывает WM_CLOSE.Если ваше приложение не отвечает, то ваш основной поток должен быть занят чем-то другим, или, скорее всего, из вашего описания происходит сбой где-то в обработчике WM_CLOSE.

Можете ли вы отладить свое приложение, чтобы найти, где возникает исключение

3 голосов
/ 28 февраля 2012

Да, это варианты.

Для полноты обратите внимание, что приложения в консольном режиме получают отправку CTRL_CLOSE_EVENT, на которую вы можете реагировать при нажатии кнопки «Завершить задачу».

Обратите внимание, что вы не можете перехватить или отреагировать на TerminateProcess. Ваш процесс умрет, и вы ничего не сможете сделать до того, как это произойдет. На самом деле, было бы довольно плохо, если бы вы могли . Потому что тогда не было бы способа прекратить процесс, который стал бесполезным.

1 голос
/ 28 февраля 2012

Диспетчер задач внутренне использует функцию EndTask .Эта функция отправляет в ваше приложение сообщение WM_CLOSE .Если ваше приложение не отвечает на это сообщение, и пользователь вынуждает завершить работу вашего приложения, TerminateProcess вызывается для вашего процесса.

1 голос
/ 28 февраля 2012

Когда вы получаете WM_CLOSE, вы можете легко обнаружить это, чтобы ваше приложение могло воздействовать на него.

Я не думаю, что можно узнать, когда вызывается TerminateProcess, чтобы убить ваше приложение. Документация TerminateProcess гласит, что это немедленное и безоговорочное завершение целевого процесса.

(В зависимости от того, насколько вы хотите этого достичь, посмотрите эту ссылку о подключении к API Windows, но не ожидайте, что это будет легко.)

...