![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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;