PDA

Просмотр полной версии : Закрытие программы [Delphi]


Isis
24.06.2007, 22:11
ВОзникла проблема с закрытием стороней программы...
Вообщем я сделла чтобы через мою прогну можно было открыть другую..
AppHI := ShellExecute(Handle, 'open',PChar(Edit3.Text), nil, nil, SW_SHOWNORMAL);

Но вот мне надо сделать чтобы можно было закрыть её через мою прогу...
Программа, которую запускаю через свою прогу - консольная....

Isis
24.06.2007, 22:21
Q-74: Как закрыть внешнюю программу?

Например, Блокнот можно закрыть так:

procedure TForm1.Button1Click(Sender: TObject);
var
phandle : HWND;
begin
phandle := FindWindow('Notepad', nil);
if phandle = 0 then
RaiseLastWin32Error;
SendMessage(phandle, WM_CLOSE, 0, 0);
end;

_http://www.podgoretsky.com/ftp/Language/nps/ru.delphi.html#N74

некорректно терминэйтпроцесс..
Ну мне это ниче не дало...

Программа консольная, заголовки окна все время меняются...

Isis
24.06.2007, 22:27
Программа консольная, заголовки окна все время меняются...

Isis
24.06.2007, 22:30
Pid ведь всегда меняется :(

Joker-jar
25.06.2007, 01:56
Isis, небольшой примерчик:
var
appname: string;
start: TStartupInfo;
procInfo: TProcessInformation;
begin
appname := 'cmd.exe';
fillchar(start, sizeof(start), 0);
fillchar(procInfo,sizeof(procInfo), 0);
CreateProcess(nil,pchar(appname),nil,nil,false,0,n il,nil,start,procInfo);
sleep(1000);
TerminateProcess(procInfo.hProcess,0);
end;

Isis
25.06.2007, 02:17
Isis, небольшой примерчик:
var
appname: string;
start: TStartupInfo;
procInfo: TProcessInformation;
begin
appname := 'cmd.exe';
fillchar(start, sizeof(start), 0);
fillchar(procInfo,sizeof(procInfo), 0);
CreateProcess(nil,pchar(appname),nil,nil,false,0,n il,nil,start,procInfo);
sleep(1000);
TerminateProcess(procInfo.hProcess,0);
end;


Хм, т.е. можно прогу закрыть по имени в процессах?

Joker-jar
25.06.2007, 02:26
Не, appname := 'cmd.exe'; это я для примера запускаю консоль. CreateProccess создает процесс, структура procInfo заполняется информацией о процессе. Завершается процесс через TerminateProcess (подается procInfo.hProcess - хэндл созданного процесса). В примере через секунду. Тебе нужно будет procInfo объявить как глобальную, зарершить процесс сможешь когда тебе угодно.

Isis
25.06.2007, 03:51
Ну тут опять надо знать заголовок проги, а он постояно меняется =\

NetMan
25.06.2007, 09:59
Isis, в примере, что дал Joker-jar не надо знать заголовок окна.

_Great_
25.06.2007, 11:21
Ну тут опять надо знать заголовок проги, а он постояно меняется =\
Ты не понял примера. Там запуск идет не через shellexecute, а через createprocess, что, кстати, более красиво, но суть не в том.
CreateProcess, если запуск прошел удачно, вернет тебе ThreadId, ProcessId, hThread, hProcess созданного процесса. Дальше можно смело орудовать этими значениями (конечно, стоит их гдето сохранить). Потом вызовешь TerminateProcess(pi.hProcess, 0) и все.

Кстати, а каким боком вопрос относится к дельфи? Тему разделяю.. автору -

bopoh13
25.06.2007, 15:14
Ну тут опять надо знать заголовок проги, а он постояно меняется =\
Есть хотя бы часть заголовка, которая не меняется?!
Если ДА, то: http://delphiworld.narod.ru/base/api_find_window_and_activate_it.html