![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
ShellAPI [D7, WinME]
Adolf © (2003-01-18 14:28:00)Здравствуйте!
Дано:
Edit1.text:="Калькулятор";
{Процедура, закрывает калькулятор:}
PostMessage(FindWindow(nil,pchar(edit1.text)),WM_QUIT,0,0);
-----------------------------------------------------------
Нужно закрыть не окно с caption "Калькулятор", а работающий Калькулятор с путем C:\windows\calc.exe.
-----------------------------------------------------------
Как закрыть приложение, зная путь к нему?
Или как получить caption окна открытой из проги программы?
Jack128 (2003-01-22 09:00:00) [1]>Можно и не определять, а просто в callback-функции закрывать >все подряд
До этого ворианта я, слава богу, додумался :-)
Юрий Зотов (2003-01-22 00:35:00) [2]Можно и не определять, а просто в callback-функции закрывать все подряд. Еще вариант - не перебирать окна, а просто в каждый поток процесса послать WM_QUIT через PostThreadMessage. Еще вариант - найти и закрыть окно приложения на таскбаре, послав ему WM_SYSCOMMAND.
Jack128 (2003-01-21 21:36:00) [3]>> Adolf
Terminate Process - "некоректно" завершает прогу
при этом происходит утечка ресурсов(я понял так)
Если прога зависла то её нужно завершить именно с помощью Terminate Process,
но если прога не весит а ее нужно закрыть,
то нужно послать WM_CLOSE главному окну
alt - ctrl - del вначало посылает WM_CLOSE,
если прога в течении некоторого времени не отвечает
то винда закрывает прогу с помощью Terminate Process
ещё раз повторю вопрос :
как определить какое из окон возвращеных EnumThreadWindows главное?
Adolf (2003-01-20 17:57:00) [4]>Юрий Зотов
Дак вы ж вроде сами говорили про получение списка, terminate Process?
Или я ошибся?
Или вы изменили мысль?
З.Ы. А если что-нить зависло? Удобно :
прога зависла-вызвал завершалку-завершил зависшую. Идея уже освещалась в кладовке, я ее - по своему. Alt-Ctrl...-задачу долго завершает (у меня по крайней мере). Terminate-сразу. Какая разница выгружен ли dll если зависшая мешает работе? Завершил работу, перегрузил.
Этот Terminate Process - вообще по-моему иная тема. Мне то нандо определять и закрывать прогу, запущенную из моей проги.
WM_CLOSE - это не звучит.
Jack128 (2003-01-20 15:17:00) [5]to Юрий Зотов непонятно как определить какое из окон возвращеных EnumThreadWindows главное?
Я не смог найти нужной функции...
ADOLF (2003-01-20 14:34:00) [6]>neodiX
Код вроде сырой к сожалению ... ... ...
Юрий Зотов (2003-01-20 11:06:00) [7]> Adolf (19.01.03 22:33)
TerminateProcess может привести к тому, что останутся неосвобожденные ресурсы, невыгруженные DLL, захваченные файлы и пр. Поэтому не думаю, что Вы на верном пути.
Adolf (2003-01-19 22:33:00) [8]>Юрий Зотов
Список процессов--имеется!Я с энтим разобрался (... ...)
А определеная прога запускается с моей проги.
Идея в том, чтобы запустить файл с моей проги, получить путь к этому файлу (это все понятно!), по желанию "отменить запуск запущенной проги", ища ее по полученному после запуска пути...
----
>neodiX
Код ваш еще не пробовал, но "смотрится" нормально. Попробую. Спасибо.
neodiX (2003-01-19 15:06:00) [9]2 Юрий Зотов
Конечно вы правы, но Adolf требовал конкретного примера, вот я решил на скорую руку его написать. А про утечку ресурсов - это я просто сделал в OnFormDestroy и сюда не запостил, а остальное -это уже погружение в пояснения , что обозначает тот или иной параметр.
> 1. Получаете список процессов
> 2. В нем находите процесс нужной программы.
> 3. OpenProcess, TerminateProcess,
> 4. CloseHandle (для всех хэндлов).
я не думаю, что Adolf сдесь бы разобрался, так как он спрашивал реализовать createprocess...
Юрий Зотов (2003-01-19 14:59:00) [10]1. В коде утечка ресурсов - не освобождены оба хэндла.
2. А если программа запущена не из своей?
В общем, так.
1. Получаете список процессов
2. В нем находите процесс нужной программы.
3. OpenProcess, TerminateProcess,
4. CloseHandle (для всех хэндлов).
Примеры были на сайте (ищите через какой-нибудь Яндех по слову CreateToolhelp32Snapshot). В статьях, вроде бы, тоже есть.
В п.3 вместо OpenProcess + TerminateProcess лучше вызвать EnumThreadWindows, определить хэндл главного окна и закрыть его посылкой WM_CLOSE.
neodiX (2003-01-19 14:35:00) [11]
> 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;
Adolf (2003-01-19 14:04:00) [12]1)Адольф в гробу перевернется, если будет искать на ЭТОМ сайте ответ на эту задачу!
2)За "могу порыться" спасиба
3)Createprocess-это вроде другая история...
4)Дак как же это делать?
CjCrazy (2003-01-18 21:42:00) [13]если лень искать по сайту, то могу порыться у себя в архивах (может чего-нить найду)
neodiX (2003-01-18 16:36:00) [14]CJCrazy прав.
2 Adolf: функцией createproccess запускаешь калькулятор, функция возвращает handle процесса, когда надо закрыть калькулятор делаешь TerminateProccess, а параметр подставляя полученый handle
CJCrazy (2003-01-18 16:17:00) [15]кажется, подобная задача уже была решена где-то на этом сайте (я её даже находил). так что ищем... :)
Adolf (2003-01-18 15:26:00) [16]Ага...А поподробней, пжалста?
neodiX (2003-01-18 14:54:00) [17]если ты запустил прогу из своей проги, то ты уже имешь его proccess ID, a по нему ты в любой момент можешь убить запущеную прогу (TerminateProccess)