Einzelnen Beitrag anzeigen

perle

Registriert seit: 8. Apr 2004
183 Beiträge
 
Delphi 7 Enterprise
 
#1

Process starten und handle bekommen

  Alt 8. Nov 2004, 10:29
Hi zusammen..


ich möchte gerne aus meinem Programm heraus ein Programm unsichtbar starten (SW_HIDE) aber gleichzeitig dessen Handle speichern.

Normalerweise liste ich mit enumwindows alle fenster auf und suche mir das richtige raus, oder benutze FindWindow, scheinbar können unsichtbare Fenster so nicht gefunden werden !?

Bei recherchen bin ich dann auf CreateProcess gestoßen (in dem Zusammenhang, ein Programm zu starten und auf dessen beendigung zu warten, wofür man ja das handle benötigt).

Wenn ich mir dann die Procedur WaitForSingleObject angucke, fällt mir auf , dass dort als erster Parameter scheinbar das besagte Handle übergeben wird, welches in proc.hprocess (proc : TProcessInformation) steht.

wenn ich mir diesen Wert aber in einer Variable (hproc : Cardinal) speichere und dann versuche mit
ShowWindow(hproc,SW_HIDE); das Fenster verschwinden zu lassen tut sich nichts.

Was mache ich also falsch?


hier auch mal der Code, den ich zum testen verwendet hab:

Code:
function ExecAndWait(const Filename, Params: string;
                     WindowState: word): boolean;
var
  SUInfo: TStartupInfo;
  ProcInfo: TProcessInformation;
  CmdLine: string;
begin
  CmdLine := '"' + Filename + '" ' + Params;
  FillChar(SUInfo, SizeOf(SUInfo), #0);
  with SUInfo do begin
    cb := SizeOf(SUInfo);
    dwFlags := STARTF_USESHOWWINDOW;
    wShowWindow := WindowState;
  end;
  Result := CreateProcess(NIL, PChar(CmdLine), NIL, NIL, FALSE,
                          CREATE_NEW_CONSOLE or
                          NORMAL_PRIORITY_CLASS, NIL,
                          PChar(ExtractFilePath(Filename)),
                          SUInfo, ProcInfo);
  { Wait for it to finish. }
  if Result then begin
    hProc := ProcInfo.hProcess;
    ShowWindow(hproc, SW_HIDE);                   // ich weiss, dass ich den prozess auch gleich mit diesem Windowstate
                                                   // öffnen kann, es war nur zu testzwecken , wie schon gesagt.
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  if OpenDialog1.Execute then
    ExecAndWait(OpenDialog1.FileName,'',SW_SHOW);
end;

ps: nein das wird kein Trojaner, keylogger oder sonstiges in der Art.
  Mit Zitat antworten Zitat