Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Программное закрытие окна


RSN ©   (2003-08-17 22:18:00) 

Создаю процесс с использованием arj, zip и т.д. Как после его завершения програмно закрыть окно (Сеанс завершен) - arj.
В свойствах это достигается путем установки галочки "Закрывать окно по завершении работы".


BillyJeans   (2003-08-19 10:37:00) [1]

используй arj32.exe


Song   (2003-08-18 14:34:00) [2]

2nikus © (18.08.03 14:12) [3]
Запусти arj в твоём варианте, комп никогда не выйдет из WaitForSingleObject(pi.hProcess, INFINITE);


nikus   (2003-08-18 14:12:00) [3]

Запускай процесс через CreateProcess, а не WinExec/ShellExecute. Тогда никаких окон типа "Сеанс завершён..." по идее быть не должно.

Когда-то писал консольную прогу для конвертации архивов, и в ней юзал такую функцию, быть может, поможет...

function RunAndWait(cmdline : string) : DWord;
var si : Startupinfo; pi : Process_Information;
begin
ZeroMemory(@si,sizeof(si));
si.cb:=SizeOf(si);
si.wShowWindow := SW_HIDE;
si.hStdInput := GetStdHandle(STD_INPUT_HANDLE);
si.hStdOutput := GetStdHandle(STD_OUTPUT_HANDLE);
si.dwFlags := STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES or
STARTF_FORCEONFEEDBACK;
if not CreateProcess(nil, PChar(cmdline), nil,
nil, False, 0, nil, nil, si, pi) then exit;
WaitForSingleObject(pi.hProcess, INFINITE);
GetExitCodeProcess(pi.hProcess, result);
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
end;


Процесс архивации отображается в том же консольном окне, а сама программа останавливается до завершения архивации.


Song   (2003-08-18 08:58:00) [4]

Универсальная для dos и win32 процессов:

Procedure TZakazCard.CrProcess(FileName, S, Dir, WindowName: String);
Var SeInfo:TShellExecuteInfo;
ExitCode: DWord;
Begin
FillChar(SEInfo,SizeOf(SEInfo),0);
With SEInfo Do
Begin
cbSize:=SizeOf(TShellExecuteInfo);
fmask:=SEE_MASK_NOCLOSEPROCESS;
Wnd:=Application.Handle;
lpFile:=PChar("""+FileName+""");
lpParameters:=PChar(S);
lpDirectory:=nil;
nShow:=SW_HIDE;
End;
IF ShellExecuteEx(@SEInfo) then
Repeat
Application.ProcessMessages;
GetExitCodeProcess(SEInfo.hProcess,ExitCode);
Until (FindWindow(nil,PChar(WindowName))<>0) or
(ExitCode<>STILL_ACTIVE) or (Application.Terminated) else
Begin
ProgressForm.Close;
NewSp5Form.MakeSound(400,100);
MessageDlg("Ошибка создания внешнего процесса. Код ошибки: ZakazCardUnitx171: ""+SysErrorMessage(GetLastError)+"".",mtError,[mbAbort],0);
End;
CloseHandle(SEInfo.hProcess);
IF FindWindow(nil,PChar(WindowName))<>0 then
Begin
SendMessage(FindWindow(nil,PChar(WindowName)),WM_CLOSE,0,0);
While FindWindow(nil,PChar(WindowName))<>0 Do Application.ProcessMessages;
End;
End;


Использование:

CrProcess(...,"(Сеанс завершен) - Arj");


P.S. Выкинь лишнее.


Дмитрий В. Белькевич   (2003-08-18 01:24:00) [5]

Как вариант - запускать не arj непосредственно, а создавать на него ярлык, где поставить галку "закрывать после завершения". И уже этот ярлык запускать. У меня именно так некоторые батники запускаются.


Наверх

Титульная страница Поиск, карта сайта Написать письмо