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

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

ShellExecute (спрятать запущенный процесс)


Garacio ©   (2007-01-13 15:11:00) 

Прочитал на одном форуме: можно найти процесс по .exe файлу - это действительно возможно? Я запускаю внешнюю программу с помощью ShellExecute и одновременно прячу свою в трей, и мне необходимо, как минимум, знать - когда запущенный процесс прекратится и развернуть свою программу из трея, а в лучем случае ещё и спрятать запущенный процесс.
Если это выполнимо, то огромная просьба поделиться примером кода!


DrPass   (2007-01-15 10:49:00) [1]


> Garacio ©   (15.01.07 09:55) [10]

Ты ж программист (ну, или пытаешься им стать). Где твое любопытство? Возьми и посмотри, что такое ShellExecuteEx и что такое TShellExecuteInfo


Garacio   (2007-01-15 09:55:00) [2]

А Kluchгде прописывается?


DrPass   (2007-01-14 18:36:00) [3]

Как-нибудь так:

var
 exInfo: TShellExecuteInfo;
begin
 FillChar(exInfo, SizeOf(exInfo), 0);
 with exInfo do
 begin
   cbSize := SizeOf(exInfo);
   fMask := SEE_MASK_NOCLOSEPROCESS or SEE_MASK_FLAG_DDEWAIT;
   Wnd := Application.Handle;
   ExInfo.lpVerb := 'open';
   lpFile := Adres;
   nShow := SW_SHOWNORMAL;
 end;
 if ShellExecuteEx(@exInfo) then
 begin
   WaitForSingleObject(exInfo.hProcess, INFINITE);
   //...
 end
end;


Garacio   (2007-01-14 18:03:00) [4]

DrPass, продемонстрируй ради примера! Как продолжить?!
if ShellExecute(Application.Handle, nil, Adres, Kluch, nil, SW_SHOW)<32 then begin
Adres- путь к .exe файлу;
Kluch- ключ в командной строке;


DrPass   (2007-01-14 17:58:00) [5]


> FAskerQ   (13.01.07 20:23) [5]

Это анальный способ решения данной задачи. Правильный - использовать не ShellExecute, а ShellExecuteEx. Она возвратит ID запущенного процесса, который нужно подставить в функцию WaitForSingleObject. Которая покажет, когда запущенный процесс завершится.


Garacio   (2007-01-13 20:51:00) [6]

Спасибо! Супер!


FAskerQ   (2007-01-13 20:23:00) [7]

ShellExecute(Handle, 'open', 'c:\Windows\notepad.exe', nil, nil, SW_HIDE);

...

в таймере например
if not IsProcessRunnig('notepad.exe') then
begin
 совершить определённые дейстия
end;


придвиньтесь поближе к экрану и начинайте передачу кода своей программы на низкой частоте потому что я никак не вьеду в суть вопроса, а телепат из меня хреновый


Garacio   (2007-01-13 19:50:00) [8]

Задача - минимум: совершить определённые дейстия послезакрытия запущенной через ShellExecute программы.
Во-вторых, хотелось бы спрятать запущенное через ShellExecute приложение (на всё время работы этого приложения).


FAskerQ   (2007-01-13 19:11:00) [9]


> необходимо, как минимум, знать - когда запущенный процесс
> прекратится


Пожалуйста

FAskerQ   (13.01.07 17:55) [1]


> когда запущенный процесс прекратится
> и развернуть свою программу из трея, а в лучем случае ещё
> и спрятать запущенный процесс


То есть процесса уже нет а вы хотите его спрятать? или что?


Garacio   (2007-01-13 18:39:00) [10]

И куда сдесь поместить:
ShowMessage('Задача выполнена!')
и
SW_HIDE ???


FAskerQ   (2007-01-13 17:55:00) [11]

uses
 TlHelp32;

function IsProcessRunnig(ExeName: string): Boolean;
var
 ContinueLoop: BOOL;
 FSnapshotHandle: THandle;
 FProcessEntry32: TProcessEntry32;
begin
 FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
 FProcessEntry32.dwSize := SizeOf(FProcessEntry32);
 ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32);
 Result := False;
 while Integer(ContinueLoop) <> 0 do
 begin
   if FProcessEntry32.szExeFile = ExeName then
   begin
     Result := True;
   end;
   ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32);
 end;
 CloseHandle(FSnapshotHandle);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
if IsProcessRunnig('notepad.exe') then
  ShowMessage('process is running')
else
  ShowMessage('process not running');
end;


Наверх

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