Есть ли способ перехватить команду «Kill» процесса в Windows (.NET)? - PullRequest
3 голосов
/ 06 марта 2012

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

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

Ответы [ 3 ]

4 голосов
/ 08 марта 2012

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

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

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

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

2 голосов
/ 06 марта 2012

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

0 голосов
/ 06 марта 2012

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

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