Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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.6 MB
Время: 0.058 c
6-29994
Владимир
2003-01-19 08:17
2003.03.10
DHCP и TCP/IP


7-30169
ed
2003-01-09 13:26
2003.03.10
mouse


7-30137
RV
2003-01-09 11:16
2003.03.10
Как узнать, что выключили свет?


3-29785
vell
2003-02-18 14:23
2003.03.10
SQL


8-29962
kucherav
2002-11-26 20:12
2003.03.10
может вопрос и не в тему, но все-таки





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский