oczekiwanie na uruchomienie danego procesu

0

witam,

szukalem troche i znalazlem jak zakonczyc usunac swoj program, odpalic i kontrolowac inna aplikacje ze swojej itd, ale nie znalazlem odpowiedzi na pytanie - jak ustawic, by program dzialal w tle (np. w trayu) i czekal na odpalenie konkretnej aplikacji, np. gadu-gadu albo ff

ma ktos jakies pomysly?

0

program w tray'u => FAQ
czekanie na inna => spis aktywnych watkow, jakies FindWindow(), itp

0

znowu zle ulozylem pytanie - chodzi mi tylko jak zrobic, by oczekiwal na dana aplikacje, bo w traya juz mam

ech ; c

jesli chodzi o uchwyt, to potrafie go zrobic, ale nie iwme jak opoznic aplikacje do czasu startu danej aplikacji

nikt nie pomoze? ;C

ogolnikowo mi nie potrzeba : (

0

Przykład jak sprawdzić czy proces istnieje. Możesz przerobić na sprawdzanie po nazwie procesu lub procesu pliku, bo ten przykład zrobiłem na własne potrzeby na sprawdzanie po numerze PID procesu...

function ProcessExists(PID: string): Boolean;
var
 i: integer;
 H1, H2: THandle;
 Lista: TStringList;
 Proces: tagPROCESSENTRY32;
begin
 Result := False;
 Lista  := TStringList.Create;
 H1     := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
 Proces.dwSize := SizeOf(Proces);

 if Process32First(H1, Proces) then
  repeat
    H2 := OpenProcess(PROCESS_QUERY_INFORMATION, False, Proces.th32ProcessID);
    Lista.Add(IntToStr(Proces.th32ProcessID));
    CloseHandle(H2);
  until not Process32Next(H1, Proces);
 CloseHandle(H1);

 Sleep(60);
 Application.ProcessMessages;
 for i := Lista.Count-1 downto 0 do
  if Lista.Strings[i] = PID then
    begin
     Result := True;
     Break;
    end;

 Lista.Free;
end;

Jeśli proces o np.: numerze PID 1000 istnieje, wartość funkcji zwraca wartość

True

Tutaj masz jak pobrać nazwę pliku procesu na podstawie numeru PID z powyżeszej funkcji:

function ProcessFileName(PID: DWORD): string;
var
  Handle: THandle;
begin
    Result := '';
    Handle := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, False, PID);
 if Handle <> 0 then try
    SetLength(Result, MAX_PATH); begin
 if GetModuleFileNameEx(Handle, 0, PChar(Result), MAX_PATH) > 0 then
    SetLength(Result, StrLen(PChar(Result))) else Result := ''; end;
 finally CloseHandle(Handle); end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 ShowMessage(ProcessFileName(1000));
end;

Oraz jak pobrać listę samych nazw procesów:

var
 _HWND : THandle;
 Proc : TProcessEntry32;
begin
  Process.Clear;
  _HWND := CreateToolHelp32SnapShot(TH32CS_SNAPALL,0);
  Proc.dwSize:=SizeOf(Proc);
   if Integer(Process32First(_HWND, Proc)) <> 0 then
    repeat
      ListBox1.Items.Add(Proc.szExeFile);
    until Integer(Process32Next(_HWND, Proc)) = 0;
  CloseHandle(_HWND);
end;

Wymagane unity:

uses
  TlHelp32, PSApi, ShellApi, ShlObj;

Jak "wmontować" to w swój program, pozostawiam Tobie do prostej nauki :d

0

dzieki Ci wielkie, juz myslalem z nikt mi nie pomoze

jak cos to moge uderzyc na pw? ;-)

0
ryjek napisał(a)

jak cos to moge uderzyc na pw? ;-)

Na pewno poradzisz sobie sam ;]

0

tak, juz sobie poradzilem :-)

dzieki wielkie, nareszcie moge dokonczyc program.

1 użytkowników online, w tym zalogowanych: 0, gości: 1