Вопрос № 17924: Здраствуйте! Подскажите, как можно принудительно завершить программу. Допустим, у меня есть запущенная прога (любая). Что нужно написать, чтобы её вырубить стандартными средствами (вроде "Shell.Quit "path"), если конечно возможно, если...
Вопрос № 17924
Здраствуйте! Подскажите, как можно принудительно завершить программу. Допустим, у меня есть запущенная прога (любая). Что нужно написать, чтобы её вырубить стандартными средствами (вроде "Shell.Quit "path"), если конечно возможно, если нет, то просто выкинуть из памяти,как это делают менеджеры задач.
Отправлен: 07.03.2005, 00:54
Вопрос задал: Andrey465 (статус: Посетитель)
Всего ответов отправлено: 3
Отвечает: Licvidator
Здравствуйте, Andrey465!
Так как Вы не написали, какими данными распологаете, то приведу только общий принцип:
1. С помощью FindWindow находите нужное окно и получаете его хенделл (handle). Исходные данные - заголовок окна или класс окна.
2. Перебираете все окна от данного процесса (EnumWindows) и получаете хенделл каждого процесса с помощью GetWindowThreadProcessId
3. Открываете процесс с помощью OpenProcess с флагом PROCESS_TERMINATE
4. Убиваете процесс с помощью TerminateProcess
5. Корректно уничтожаем объект в памяти - CloseHandle.
Есть более "гуманный", если можно так выразится, способ:
1. FindWindow
2. GetWindow - получаем хенделл родительского окна
3. "Вежливо просим его закрыться" SENDMESSAGE с флагом WM_CLOSE
А вообще, ситуация довольно неоднозначная, слишком общая, я бы так сказал... Приведенные выше примеры могут видоизменяться и даже не работать совсем (процесс может быть таким, что не откроется с правом TERMINATE, так же нельзя будет открыть псевдопроцесс SYSTEM и IDLE (его вообще не открыть, так как у него нулевой идентификатор)).
Читайте API, юзайте Google. Удачи!
Ответ отправил: Licvidator (статус: Профессор)
Отправлен: 07.03.2005, 01:27 Оценка за ответ: 5
Отвечает: PavPS
Здравствуйте, Andrey465!
Перебирай все процессы по именам, предварительно создав полный список с помощью CreateToolhelp32Snapshot, потом перибираешь в цикле каждый начиная Process32First и далее Process32Next. Они дают тебе структуру, где можно найти имя. Если имя совпало, то из этой же структуры достаешь PID и TerminateProcess...
Ответ отправил: PavPS (статус: 6-ой класс)
Отправлен: 07.03.2005, 02:26 Оценка за ответ: 5
Отвечает: Зубар Тарас Васильевич
Здравствуйте, Andrey465!
Можно использовать АПИ TerminateProcess:
Public Declare Function TerminateProcess Lib "kernel32" Alias "TerminateProcess" (ByVal hProcess As Long, ByVal uExitCode As Long) As Long
Ответ отправил: Зубар Тарас Васильевич (статус: 1-ый класс)
Отправлен: 07.03.2005, 14:09 Оценка за ответ: 5