Форум: "WinAPI";
Текущий архив: 2003.03.10;
Скачать: [xml.tar.bz2];
ВнизShellAPI Найти похожие ветки
← →
Adolf (2003-01-18 14:28) [0]Здравствуйте!
Дано:
Edit1.text:="Калькулятор";
{Процедура, закрывает калькулятор:}
PostMessage(FindWindow(nil,pchar(edit1.text)),WM_QUIT,0,0);
-----------------------------------------------------------
Нужно закрыть не окно с caption "Калькулятор", а работающий Калькулятор с путем C:\windows\calc.exe.
-----------------------------------------------------------
Как закрыть приложение, зная путь к нему?
Или как получить caption окна открытой из проги программы?
← →
neodiX (2003-01-18 14:54) [1]если ты запустил прогу из своей проги, то ты уже имешь его proccess ID, a по нему ты в любой момент можешь убить запущеную прогу (TerminateProccess)
← →
Adolf (2003-01-18 15:26) [2]Ага...А поподробней, пжалста?
← →
CJCrazy (2003-01-18 16:17) [3]кажется, подобная задача уже была решена где-то на этом сайте (я её даже находил). так что ищем... :)
← →
neodiX (2003-01-18 16:36) [4]CJCrazy прав.
2 Adolf: функцией createproccess запускаешь калькулятор, функция возвращает handle процесса, когда надо закрыть калькулятор делаешь TerminateProccess, а параметр подставляя полученый handle
← →
CjCrazy (2003-01-18 21:42) [5]если лень искать по сайту, то могу порыться у себя в архивах (может чего-нить найду)
← →
Adolf (2003-01-19 14:04) [6]1)Адольф в гробу перевернется, если будет искать на ЭТОМ сайте ответ на эту задачу!
2)За "могу порыться" спасиба
3)Createprocess-это вроде другая история...
4)Дак как же это делать?
← →
neodiX (2003-01-19 14:35) [7]
> 4)Дак как же это делать?
да вот так:
var
si:STARTUPINFO;
pi:PROCESS_INFORMATION;
procedure TForm1.Button1Click(Sender: TObject);
begin
FillMemory( @si, sizeof( si ), 0 );
si.cb := sizeof( si );
Createprocess(nil,pchar("d:\winnt\system32\calc.exe"),nil,nil,false,
NORMAL_PRIORITY_CLASS,nil,nil,si,pi);
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
terminateprocess(pi.hProcess,255);
end;
← →
Юрий Зотов (2003-01-19 14:59) [8]1. В коде утечка ресурсов - не освобождены оба хэндла.
2. А если программа запущена не из своей?
В общем, так.
1. Получаете список процессов
2. В нем находите процесс нужной программы.
3. OpenProcess, TerminateProcess,
4. CloseHandle (для всех хэндлов).
Примеры были на сайте (ищите через какой-нибудь Яндех по слову CreateToolhelp32Snapshot). В статьях, вроде бы, тоже есть.
В п.3 вместо OpenProcess + TerminateProcess лучше вызвать EnumThreadWindows, определить хэндл главного окна и закрыть его посылкой WM_CLOSE.
← →
neodiX (2003-01-19 15:06) [9]2 Юрий Зотов
Конечно вы правы, но Adolf требовал конкретного примера, вот я решил на скорую руку его написать. А про утечку ресурсов - это я просто сделал в OnFormDestroy и сюда не запостил, а остальное -это уже погружение в пояснения , что обозначает тот или иной параметр.
> 1. Получаете список процессов
> 2. В нем находите процесс нужной программы.
> 3. OpenProcess, TerminateProcess,
> 4. CloseHandle (для всех хэндлов).
я не думаю, что Adolf сдесь бы разобрался, так как он спрашивал реализовать createprocess...
← →
Adolf (2003-01-19 22:33) [10]>Юрий Зотов
Список процессов--имеется!Я с энтим разобрался (... ...)
А определеная прога запускается с моей проги.
Идея в том, чтобы запустить файл с моей проги, получить путь к этому файлу (это все понятно!), по желанию "отменить запуск запущенной проги", ища ее по полученному после запуска пути...
----
>neodiX
Код ваш еще не пробовал, но "смотрится" нормально. Попробую. Спасибо.
← →
Юрий Зотов (2003-01-20 11:06) [11]> Adolf (19.01.03 22:33)
TerminateProcess может привести к тому, что останутся неосвобожденные ресурсы, невыгруженные DLL, захваченные файлы и пр. Поэтому не думаю, что Вы на верном пути.
← →
ADOLF (2003-01-20 14:34) [12]>neodiX
Код вроде сырой к сожалению ... ... ...
← →
Jack128 (2003-01-20 15:17) [13]to Юрий Зотов непонятно как определить какое из окон возвращеных EnumThreadWindows главное?
Я не смог найти нужной функции...
← →
Adolf (2003-01-20 17:57) [14]>Юрий Зотов
Дак вы ж вроде сами говорили про получение списка, terminate Process?
Или я ошибся?
Или вы изменили мысль?
З.Ы. А если что-нить зависло? Удобно :
прога зависла-вызвал завершалку-завершил зависшую. Идея уже освещалась в кладовке, я ее - по своему. Alt-Ctrl...-задачу долго завершает (у меня по крайней мере). Terminate-сразу. Какая разница выгружен ли dll если зависшая мешает работе? Завершил работу, перегрузил.
Этот Terminate Process - вообще по-моему иная тема. Мне то нандо определять и закрывать прогу, запущенную из моей проги.
WM_CLOSE - это не звучит.
← →
Jack128 (2003-01-21 21:36) [15]>> Adolf
Terminate Process - "некоректно" завершает прогу
при этом происходит утечка ресурсов(я понял так)
Если прога зависла то её нужно завершить именно с помощью Terminate Process,
но если прога не весит а ее нужно закрыть,
то нужно послать WM_CLOSE главному окну
alt - ctrl - del вначало посылает WM_CLOSE,
если прога в течении некоторого времени не отвечает
то винда закрывает прогу с помощью Terminate Process
ещё раз повторю вопрос :
как определить какое из окон возвращеных EnumThreadWindows главное?
← →
Юрий Зотов (2003-01-22 00:35) [16]Можно и не определять, а просто в callback-функции закрывать все подряд. Еще вариант - не перебирать окна, а просто в каждый поток процесса послать WM_QUIT через PostThreadMessage. Еще вариант - найти и закрыть окно приложения на таскбаре, послав ему WM_SYSCOMMAND.
← →
Jack128 (2003-01-22 09:00) [17]>Можно и не определять, а просто в callback-функции закрывать >все подряд
До этого ворианта я, слава богу, додумался :-)
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2003.03.10;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.007 c