2012-03-06 3 views
3

У меня есть консольное приложение Windows, написанное на .NET 4.0 (C#), и если приложение/процесс убито ненормально (например, из диспетчера задач или отключение операционной системы), есть ли способ перехватить это, чтобы некоторые может быть выполнен код очистки?Есть ли способ перехватить команду «Убить» в Windows (.NET)?

Спасибо за любую помощь.

+0

Вставить комментарий о том, «насколько безопасно пытаться выполнить очистку, если весь процесс будет снят». –

+0

Проверьте это: http://stackoverflow.com/questions/838261/handling-end-process-of-a-windows-app Версия .net отличается от концепции, но концепция по-прежнему сохраняется. – seth

ответ

2

Посмотрите на Win32.SystemEvents есть хорошие примеры того, как обнаружить эти события ..

0

Там вообще нет какой-либо способ справиться с процессом, который был убит, но вы должны быть в состоянии обрабатывать события которые происходят при выходе приложения. (Подумайте: если бы вы могли обработать процесс, который был убит, было бы действительно очень легко написать какой-то ужасный материал типа шпионского ПО). Если я правильно помню, есть способ проверить, почему приложение закрывается. В зависимости от того, что вызывает его закрытие, вы можете реагировать по-разному.

4

Вы не можете обнаружить, что ваш собственный процесс убит. Когда кто-то вызывает NtTerminateProcess() с вашим процессом, и у них есть разрешение на это, вам не сообщается. Ваши потоки останавливаются, и ваш процесс исчезает из-под вас.

К счастью, большая часть очистки не требуется вручную - вся эта память, которую вы не освободили, будет освобождена ОС, все эти системные дескрипторы, которые вы не закрыли, будут автоматически очищены и все временные файлы, которые вы открыли как TEMPORARY (вы делаете это правильно?), будут автоматически удалены.

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

Похоже, что лучший способ для вашего управления процессом - предоставить вам законный способ выхода из процесса - будь то через окно, которое обрабатывает событие WM_CLOSE или запускает его в консоли, которая может прерываться с помощью красной кнопки X в углу. Диспетчер задач должен быть крайней мерой. Если у пользователя возникнет проблема с Ctrl + Alt + Del ваш процесс до смерти, у вас нет второго шанса.

Смежные вопросы