Я хочу завершить много процессов, но я хочу дать каждому процессу шанс сохранить его данные, спросить пользователя о том, чтобы сохранить файл и даже проигнорировать близкий запрос.
Так TerminateProcess
вне рассмотрения, потому что это уничтожает процесс немедленно. Иначе должен был бы использовать SendMessage
/PostMessage
отправить a WM_CLOSE
к главному окну к сожалению, я ничего не знаю об окнах процессов, у меня только есть идентификатор процесса, таким образом, FindWindow
не помогает также. Там какой-либо другой путь состоит в том, чтобы найти главные окна процесса?
Другими словами: там какой-либо путь состоит в том, чтобы завершить какой-либо процесс корректно точно так же, как диспетчер задач делает при нажатии на "End Task"? (и не "Заканчивают Процесс"),
Лучше ли подключаемый модуль 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 ниже для правильного метода работы с консольными приложениями.
Я не слишком уверен в API Win32, но вы можете Shell выполнить функцию командной строки Taskkill
.
taskkill /?
taskkill /pid 1230
taskkill /im notepad.exe
Переключатель / F заставит убить, но не использовать его, только отправляет сигнал завершения, чтобы приложение закрылось изящно.
см. MSKB Q178893 Как завершить Применение «Чисто» в Win32
Используйте функцию API EndTask. Это та же функция, которая используется диспетчером задач.
BOOL EndTask(
HWND hWnd,
BOOL fShutDown,
BOOL fForce
);
http://msdn.microsoft.com/en-us/Library/ms633492 (vs.85) .aspx