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

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

Открыть и закрыть чужую программу. [D7, WinXP]


STK ©   (2005-01-03 19:44:00) 

С наступившем Всех.
Банальный вопрос конечно, но мне надо запустить несколько чужих программ зная их путь, и через некоторое время их закрыть(по одному открыть и поодному закрыть). При этом обе программы могут быть свёрнуты развернуты, без разницы. Поиск по имени окна не подойдёт у всех запускаемых программ разные Caption.
<br>Я многое испробовал. но чё то ни черта не работает.  <br> Заранее спасибо.


STK   (2005-01-05 22:04:00) [1]


> GuAV ©   (05.01.05 17:12) [13]

Спасибо за пояснения. Real.


GuAV   (2005-01-05 17:12:00) [2]


> Или твой вариант Лишён таких недостатков. Если да то
> кратко поясни почему.


В MSDN в разделе про TerminateProcess есть пояснение. Не выполнится не только код завершения поцесса, но и код завершения библиотек

[6] c добавленным CloseHandle(hThread); CloseHandle(hProcess); лишен этих недостатков, т.к. закрывает приложение "нажатием на кнопку закрыть прграмно". Т.е. если есть несохранённый текст, будет выдан запрос на сохранение.

Вообще если снять задачу через Ctrl+Alt+Del то windows сначала делает что-то вроде моего кода, потом ждёт (это можно сделать WaitForSingleObject) и уже потом прибивает процесс.


> WaitForInputIdle(hProcess, INFINITE);

Ждёт когда процесс начнёт ожидать ввода пользователя. Обычно это означает "зверешение инициализации". Возвращает результат: дождались, нет, ошибка. Всё описано опять же в MSDN или в справке.


STK   (2005-01-05 16:50:00) [3]


> GuAV ©   (05.01.05 00:48) [11]
> STK ©   (05.01.05 0:25) [10]
>
> Прогу - нет. Но ресурсы которые не освобождаются (ну там
> атомы всякие) - жалко. Потом, может она что-о при выходе
> сохраняет...


Думш оба варианта не оставляют за собой отпечаток?

Или твой вариант Лишён таких недостатков. Если да то кратко поясни почему.

И к стати(е) мне не надо Ждать пока прога отработает: WaitForInputIdle(hProcess, INFINITE);т.к. как помните Масяня как проиграет сама(Редиска эдакая) не закрывается.

И не могли бы кто ни будь мне пояснить что делает эта фунца и какой параметр выдаёт.

Заранее ещё раз спасибо.


GuAV   (2005-01-05 00:48:00) [4]

STK ©   (05.01.05 0:25) [10]

Прогу - нет. Но ресурсы которые не освобождаются (ну там атомы всякие) - жалко. Потом, может она что-о при выходе сохраняет...


STK   (2005-01-05 00:25:00) [5]

>> GuAV

Тебе жалко её что ли, флаг с ней с программой, она же не человек, мы ведь о людях думаем(ну когда прогаем).

Али нет???


GuAV   (2005-01-05 00:14:00) [6]

...а всё таки убивать процесс нехорошо...это только "at last resort"..


STK   (2005-01-04 23:18:00) [7]

>> GanibalLector-у
Спасибо большое реально работает.
Спасибо всем кто отвечал.


GuAV   (2005-01-04 02:22:00) [8]

GuAV ©   (04.01.05 2:13) [6]
Пора закрывать хендлы CloseHandle(hThread); CloseHandle(hProcess); и идти спать.


GuAV   (2005-01-04 02:13:00) [9]

function EnumThreadWndProc(hWnd: HWND; lParam: LPARAM): BOOL; stdcall;
var exstyle: DWORD;
begin
 if IsWindowVisible(hWnd) then
   begin
      exstyle := GetWindowLong(hWnd, GWL_EXSTYLE);
      if ((exstyle and WS_EX_APPWINDOW <> 0) or
        (exstyle and WS_EX_TOOLWINDOW = 0)) and
       (GetWindowLong(hWnd, GWL_HWNDPARENT) = 0) then
        begin
          PHandle(lParam)^ := hWnd;
          Result := False;
          Exit;
        end;
   end;
 Result := True;
end;

procedure RunAndCloseCalc;
var
 StartupInfo: TStartupInfo;
 ProcessInfo: TProcessInformation;
 hwndMain: HWND;
begin
 FillChar(StartupInfo, SizeOf(StartupInfo), 0);
 StartupInfo.cb := SizeOf(StartupInfo);
 if not CreateProcess(nil, 'calc.exe', nil, nil, False, 0,
   nil, nil, StartUpInfo, ProcessInfo) then RaiseLastOSError;
 with ProcessInfo do
 begin
   WaitForInputIdle(hProcess, INFINITE);
   Sleep(2000);
   EnumThreadWindows(dwThreadId, @EnumThreadWndProc,
     LPARAM(@hwndMain));
   if hwndMain <> 0 then
     SendMessage(hwndMain, WM_SYSCOMMAND, SC_CLOSE, 0);
 end;
end;


GuAV   (2005-01-04 01:55:00) [10]

Блин, что вы так грубо... TerminateProcess...
Не лучше ли найти окно верхнего уровня, видное на taskbar и попытаться закрыть его WM_SYSCOMMAND, SC_CLOSE ?


GanibalLector   (2005-01-04 01:18:00) [11]


var
Rlst: LongBool;
StartUpInfo: TStartUpInfo;
ProcessInfo: TProcessInformation;
Error: integer;
ExitCode: Cardinal;
begin
FillChar(StartUpInfo, SizeOf(TStartUpInfo), 0);
with StartUpInfo do
begin
cb := SizeOf(TStartUpInfo);
dwFlags := STARTF_USESHOWWINDOW or STARTF_FORCEONFEEDBACK;
wShowWindow := SW_SHOWNORMAL;
end;
Rlst := CreateProcess('E:\Windows\System32\calc.exe', nil, nil, nil, false, NORMAL_PRIORITY_CLASS, nil, nil, StartUpInfo, ProcessInfo);
if Rlst then
with ProcessInfo do begin
WaitForInputIdle(hProcess, INFINITE); // æäåì çàâåðøåíèÿ èíèöèàëèçàöèè
Sleep(2000);
TerminateProcess(hProcess, NO_ERROR);
CloseHandle(hThread); // çàêðûâàåì äåñêðèïòîð ïðîöåññà
CloseHandle(hProcess); // çàêðûâàåì äåñêðèïòîð ïîòîêà
end
else Error := GetLastError;


STK   (2005-01-04 00:50:00) [12]

Davinchi.
Прикинь не хрена она не работает, т.e. запускает конечно (это и уменя получилось), но вот закрывать она не хочет.
Думается мне что не определяется hProcess:
когда закрывем чужую прогу:
TerminateProcess(hProcess, 0);
CloseHandle(hProcess);

Пробовал и Resultиспользовать но не чего не дало.
Может кто чего подскажет.
Если что то запускается Project Flash (Масяня *.exe).
Заранее ЕЩЁ раз сабасибо.


STK   (2005-01-04 00:02:00) [13]

Davinchi.
Спасибо за столь быстрый ответ пойду попробую. Но чё то весь этот код мне до более знаком. Но если получится напишу.
С новым годом всех кто в такие дни не покидает ФОРУМ.


Davinchi   (2005-01-03 20:34:00) [14]

Пример всегда лучше слов:

function ExecuteFile(const FileName, Params, DefaultDir: String;
ShowCmd: Integer): THandle;
var
 zFileName, zParams, zDir: array[0..79] of Char;

begin
Result := ShellExecute(Application.MainForm.Handle, nil,
StrPCopy(zFileName, FileName), StrPCopy(zParams, Params),
StrPCopy(zDir, DefaultDir), ShowCmd);
end;  


Пример вызова:


   executeFile('maker.exe','text_file','c:\maker',
SW_SHOWNORMAL);


А завершить процесс:

TerminateProcess(hProcess, 0);
CloseHandle(hProcess);


Наверх

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