Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: Программирование на Basic / VBA


Информационный Канал Subscribe.Ru

РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / Basic/VBA

Выпуск № 25
от 12.03.2005, 19:50

Администратор:Калашников О.А.
В номере:Вопросов: 1, Ответов: 3


Вопрос № 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


Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

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

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2005, RusFAQ.ru, Россия, Москва. Все права защищены.
Идея, дизайн, программирование, авторское право: Калашников О.А.


http://subscribe.ru/
http://subscribe.ru/feedback/
Подписан адрес:
Код этой рассылки: comp.soft.prog.basicvba
Отписаться

В избранное