2010-01-13 4 views
32

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

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

Другими словами: Есть ли способ прекратить любой процесс грациозно так же, как менеджер задач делает при нажатии на кнопку «End Task»? (а не «Конечный процесс»)

+0

Я предполагаю, что "задача" является верхним уровень (видимый) окном. Таким образом, 'WM_CLOSE' будет отправлен (возможно) на завершение задачи. –

+0

Если вы не разработчик программного обеспечения - просто пользователь Windows - см. [Связанный с ним вопрос о суперпользователе о том, как изящно попросить запущенное приложение завершить работу) (http://superuser.com/questions/959364/on-windows- как-может-я-грациозно-аск-а-процесс-к-прекратить). – unforgettableid

+0

Обратите внимание, что с Windows 8.1 кнопка «Конечная задача» диспетчера задач теперь принудительно завершает выбранное приложение и приводит к потере любой несохраненной работы.Вы можете отредактировать свой вопрос, чтобы это отразить. – unforgettableid

ответ

22

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

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

Вы можете отправить WM_CLOSE сообщения в любое окно, которое хотите закрыть. Многие окна обрабатывают WM_CLOSE, чтобы предложить пользователю сохранить документы. Вы можете отправить сообщение WM_QUIT с помощью PostThreadMessage в обнаруженные потоки, чтобы вызвать завершение цикла сообщения.

код пользователя не разрешено вызывать DestroyWindow из другого приложения или потока к окнам ... если приложение не отвечает на WM_CLOSE или WM_QUIT запросов вы вернулись в TerminateProcess земли.

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

Нет реального способа закрыть консольные приложения изящно на Windows. Им нужно поддерживать какой-то изящный закрытый механизм.

+0

Когда у меня есть все окна процесса, я отправляю 'WM_CLOSE' в каждое окно верхнего уровня? –

+0

То, что я собирался сказать. +1. –

+2

Да - TaskManager отправляет сообщение «WM_CLOSE» в приложение. На самом деле я думаю, что он может отправить сообщение 'WM_SYSCOMMAND',' SC_CLOSE'. –

15

Я не слишком уверен в win32 apis, но вы можете использовать команду командной строки taskkill.

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

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

+4

К сожалению, это доступно только для Windows XP Professional или новее. (Даже XP дома), но мне нужна эта функциональность для Windows 2000 и XP Home. Но я бы хотел увидеть исходный код этого инструмента :) –

13
+0

+1. Охватывает множество решений Chris Becke, а также описывает обработку угловых корпусов с 16-разрядными приложениями. Ницца. –

+9

Вы должны также написать часть содержимого здесь, если страница будет нажата/перемещена. – MasterMastic

+0

Ссылка только ответы не являются хорошими ответами. Пожалуйста, сделайте так, как предложили MasterMastic, и поместите основной контент в этот ответ. –

1

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

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

http://msdn.microsoft.com/en-us/library/ms633492(VS.85).aspx

+7

Самая первая строка текста на этой странице говорит: * [Эта функция не предназначена для общего использования. Он может быть изменен или недоступен в последующих версиях Windows.] *. Может быть, активисты не нажали? – Jon

+2

@ У многих апи есть такой намек, но многие проблемы не могут быть решены без их использования. То же самое относится к «недокументированным». (я не говорю, что это один из таких случаев) –

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