2016-12-23 12 views
0

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

+0

Как вы начинаете программу? И, пожалуйста, дайте нам больше информации о том, что именно вы пытаетесь достичь. –

+1

Какой процесс должен получить эту информацию? Процесс, который должен завершиться, или внешний процесс? – IInspectable

+1

Это было задано много раз. Вы проводили какие-либо исследования? –

ответ

2

Вам нужно открыть этот процесс. Таким образом вы получите его ручку. После этого вы можете просто ждать этого дескриптора.

HANDLE h = OpenProcess(....); 
WaitForSingleObject(h); 

Ручки процессов и потоков во многих отношениях выглядят как ручки событий Windows. Как только этот процесс или поток заканчивается, они получают сигнал.

+0

Ответчик запускает код в процессе, который завершается. Так что это не поможет. –

+0

Прежде всего это неясно из OP. Во-вторых, как только процесс уже завершен, должна быть информация где-то, с которой она когда-либо начиналась. AFAIK Windows не сохраняет эту запись, по крайней мере, по умолчанию. –

+0

Если вопрос неясен, вы должны оставить комментарий с разъяснением. – IInspectable

0

Это зависит от того, как ваше приложение прекращено и какое приложение оно есть.

Для приложений с пользовательским интерфейсом:

  • Если пользователь нажимает кнопку «Завершить задачу» в диспетчере задач, вы на самом деле получить WM_DESTROY и даже WM_CLOSE сообщения обработчика сообщений.
  • Если пользователь просто нажимает кнопку X вашего приложения, очевидно, что это также относится.
  • Если пользователь выходит из системы или выключает компьютер, вы получите сообщения WM_QUERYENDSESSION и WM_ENDSESSION.

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

Для служб вы можете использовать функцию RegisterServiceCtrlHandler почти так же.

Для всех типов приложений, если приложение завершается принудительно другим процессом с помощью функции TerminateProcess, there is no way to get notified:

Если процесс завершается TerminateProcess, все потоки процесса не немедленно прекращается без какой возможность запуска дополнительного кода. Это означает, что поток не выполняет код в блоках обработчика завершения. Кроме того, никакие прикрепленные DLL не уведомлены о том, что процесс отделяется.

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