Как корректно завершить процесс?

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

Так TerminateProcess вне рассмотрения, потому что это уничтожает процесс немедленно. Иначе должен был бы использовать SendMessage/PostMessage отправить a WM_CLOSE к главному окну к сожалению, я ничего не знаю об окнах процессов, у меня только есть идентификатор процесса, таким образом, FindWindow не помогает также. Там какой-либо другой путь состоит в том, чтобы найти главные окна процесса?

Другими словами: там какой-либо путь состоит в том, чтобы завершить какой-либо процесс корректно точно так же, как диспетчер задач делает при нажатии на "End Task"? (и не "Заканчивают Процесс"),

37
задан Daniel Rikowski 13 January 2010 в 11:35
поделиться

4 ответа

Лучше ли подключаемый модуль Eclipse, чем он был, и подходит ли он для целей?

Он определенно значительно улучшился за последний год. В декабре я присутствовал на бирже Groovy & Grails в Лондоне. Был замечательный разговор об интеграции Groovy & Grails в Eclipse/SpringSource STS, который был записан, см. видео .

С моей точки зрения, Eclipse получил много земли. В настоящее время IntelliJ, кажется, немного впереди, но это может измениться в течение следующих нескольких месяцев.

-121--859205-

EnumWindows перечисляет все окна верхнего уровня в процессе. GetWindowThreadProcessId получает процесс и идентификатор каждого потока.

Теперь у вас достаточно информации для корректного закрытия любого приложения GUI.

Сообщения WM _ CLOSE можно отправлять в любое окно, которое требуется закрыть. Многие окна обрабатывают WM _ CLOSE для запроса сохранения документов. Можно отправить сообщение WM _ QUIT с помощью PostThreadMessage обнаруженным потокам для завершения цикла сообщений.

Код пользователя не может вызывать DestroyWindow из другого приложения или потока в окна... если приложение не отвечает на запросы WM _ CLOSE или WM _ QUIT , вы возвращаетесь в TerminateProcess .

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


См. T.s. Ответ Arun ниже для правильного метода работы с консольными приложениями.

26
ответ дан 27 November 2019 в 04:46
поделиться

Я не слишком уверен в API Win32, но вы можете Shell выполнить функцию командной строки Taskkill .

taskkill /?
taskkill /pid 1230
taskkill /im notepad.exe

Переключатель / F заставит убить, но не использовать его, только отправляет сигнал завершения, чтобы приложение закрылось изящно.

15
ответ дан 27 November 2019 в 04:46
поделиться
13
ответ дан 27 November 2019 в 04:46
поделиться

Используйте функцию API EndTask. Это та же функция, которая используется диспетчером задач.

BOOL EndTask(      
    HWND hWnd,
    BOOL fShutDown,
    BOOL fForce
);

http://msdn.microsoft.com/en-us/Library/ms633492 (vs.85) .aspx

1
ответ дан 27 November 2019 в 04:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: