AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Process starten und handle bekommen
Thema durchsuchen
Ansicht
Themen-Optionen

Process starten und handle bekommen

Ein Thema von perle · begonnen am 8. Nov 2004 · letzter Beitrag vom 26. Feb 2012
Antwort Antwort
Seite 1 von 2  1 2      
perle

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

Process starten und handle bekommen

  Alt 8. Nov 2004, 11: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
Benutzerbild von alcaeus
alcaeus

Registriert seit: 11. Aug 2003
Ort: München
6.537 Beiträge
 
#2

Re: Process starten und handle bekommen

  Alt 8. Nov 2004, 12:11
Hi perle,

Zitat von perle:
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?
ein kleines Detail hast du vergessen: du willst nicht den Prozess unsichtbar machen, sondern das Fenster das zum Prozess gehört. Du musst dir also das Handle des Fensters raussuchen, und nicht jenes des Prozesses.
AFAIK kannst du aber mit [dp]"ShellExecute"[/dp] Programme auch mit dem Parameter SW_HIDE starten.

Greetz
alcaeus
Andreas B.
Die Mutter der Dummen ist immer schwanger.
Ein Portal für Informatik-Studenten: www.infler.de
  Mit Zitat antworten Zitat
Benutzerbild von Jens Schumann
Jens Schumann

Registriert seit: 27. Apr 2003
Ort: Bad Honnef
1.644 Beiträge
 
Delphi 2009 Professional
 
#3

Re: Process starten und handle bekommen

  Alt 8. Nov 2004, 12:21
Hallo,
wenn Du tatsächlich das Fensterhandle benötigst, dann such hier mal nach Hier im Forum suchenWaitForInputIdle
I come from outer space to save the human race
  Mit Zitat antworten Zitat
perle

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

Re: Process starten und handle bekommen

  Alt 8. Nov 2004, 12:22
Zitat:
AFAIK kannst du aber mit Suche in der Delphi-PRAXiSShellExecute Programme auch mit dem Parameter SW_HIDE starten.
so habe ich das auch zunächst gemacht, jedoch habe ich das Fenster dann logischerweise weder mit enumwindows noch mit FindWindow gefunden (da es ja nichtmehr angezeigt wird).


wie kann ich denn über an das Handle des Fensters gelangen (auch wenns SW_HIDE ist) ?


LG Yvonne


@Jens Schuhmann : Ich habe mir ein von dir gepostetes Beispiel mal angeschaut, du ermittelst dort innerhalb der WaitForInputIdle - Schleife mit Findwindow das hanlde des Fensters, dies ist aber bei mir nicht möglich, da sich die Caption des Fensters beliebig ändert (zumindest der vordere Teil , also caption = 'hier der variable Teil - konstanter Programmname').
Mit EnumWindows finde ich , wie schon gesagt, das Fenster nicht, wenn ich es vorher schon mit sw_hide gestartet habe.
  Mit Zitat antworten Zitat
Benutzerbild von Sprint
Sprint

Registriert seit: 18. Aug 2004
Ort: Edewecht
712 Beiträge
 
Delphi 5 Professional
 
#5

Re: Process starten und handle bekommen

  Alt 8. Nov 2004, 13:36
Zitat von perle:
wie kann ich denn über an das Handle des Fensters gelangen (auch wenns SW_HIDE ist)?
Ich hab das jetzt mal mit NODEPAD.EXE und EnumWindows ausprobiert. Scheint so, als wenn das bei mir funktionieren würde.
Delphi-Quellcode:
function RunProcess(const FileName: String): HWND;

  function EnumWindowsProc(hWnd: HWND; lParam: LPARAM): BOOL; stdcall;
  begin
    TList(lParam).Add(Pointer(hWnd));
    Result := True;
  end;

var
  SI: TStartupInfo;
  PI: TProcessInformation;
  List: TList;
  ProcessId: DWORD;
  I: Integer;
begin

  Result := 0;
  List := TList.Create;
  try
    FillChar(SI, SizeOf(TStartupInfo), 0);
    SI.cb := SizeOf(TStartupInfo);
    // SI.dwFlags := STARTF_USESHOWWINDOW;
    // SI.wShowWindow := SW_HIDE;
    if CreateProcess(nil, PChar(FileName), nil, nil, False, 0, nil, nil, SI, PI) then
    begin
      WaitForInputIdle(PI.hProcess, INFINITE);
      if EnumWindows(@EnumWindowsProc, Longint(List)) then
      begin
        for I := 0 to List.Count - 1 do
        begin
          GetWindowThreadProcessId(Longint(List.Items[I]), ProcessId);
          if PI.dwProcessId = ProcessId then
          begin
            Result := Longint(List.Items[I]);
            Break;
          end;
        end;
      end;
      CloseHandle(PI.hProcess);
      CloseHandle(PI.hThread);
    end;
  finally
    List.Free;
  end;

end;

Edit: Funktioniert bei mir einwandfrei.
Ciao, Sprint.

"I don't know what I am doing, but I am sure I am having fun!"
  Mit Zitat antworten Zitat
perle

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

Re: Process starten und handle bekommen

  Alt 8. Nov 2004, 15:03
ja super , jetzt funktioniert es bei mir auch, vielen lieben Dank dafür.
  Mit Zitat antworten Zitat
Benutzerbild von Helmi
Helmi

Registriert seit: 29. Dez 2003
Ort: Erding, Republik Bayern
3.336 Beiträge
 
Delphi XE2 Professional
 
#7

AW: Process starten und handle bekommen

  Alt 24. Feb 2012, 21:47
Hallo,

ich muss diesen alten verstaubten Thread auspacken *hust*

Ich möchte den Code im vorletzten Post unter XE2 nutzen.
Nur leider bekomme ich beim Aufruf von "CreateProcess" eine Access Violation um die Ohren geschmissen.
Ich habe geprüft ob die Datei vorhanden ist.

An was könnte das liegen?
mfg
Helmi

>> Theorie ist Wissen, dass nicht funktioniert - Praxis ist, wenn alles funktioniert und keiner weiss warum! <<
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#8

AW: Process starten und handle bekommen

  Alt 24. Feb 2012, 21:57
64 Bit?

Wenn ja, dann werden wohl die Handle/Pointer-Casts mit LongInt nicht mehr ganz funktionieren.



Lagere eventuell auch mal das EnumWindowsProc probehalber als eigenständige Prozedur aus.


Beim CreateProcess selber kann ich aber keinen Fehler erkennen.
$2B or not $2B

Geändert von himitsu (24. Feb 2012 um 22:04 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Helmi
Helmi

Registriert seit: 29. Dez 2003
Ort: Erding, Republik Bayern
3.336 Beiträge
 
Delphi XE2 Professional
 
#9

AW: Process starten und handle bekommen

  Alt 24. Feb 2012, 22:03
nein - 32 Bit

Ich hab mir jetzt mal die Variablen anschaut, die übergeben werden müssen, und da viel mir auf, dass der Dateiname als erstes übergeben werden muss

Also so:

if CreateProcess(PChar(FileName), nil, nil, nil, False, 0, nil, nil, SI, PI) then Und dann gehts...



[edit]

... doch nicht!

Leider funktioniert dann der Vergleich der ProcessId nicht mehr

Delphi-Quellcode:
         if PI.dwProcessId = ProcessId then
           begin
             Result := Longint(List.Items[I]);
             Break;
           end;
[Edit2]

Das erste Edit war falsch! - es funktioniert doch - nur darf der Process nicht schon laufen
mfg
Helmi

>> Theorie ist Wissen, dass nicht funktioniert - Praxis ist, wenn alles funktioniert und keiner weiss warum! <<

Geändert von Helmi (24. Feb 2012 um 22:17 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#10

AW: Process starten und handle bekommen

  Alt 24. Feb 2012, 23:09
Muß nicht der erste Parameter sein.

Ist das erste NIL, dann wird das Zweite als CommandLine verwendet (so wie man es im Start-Menü > Ausführen oder in der Konsole eingeben kann).

Aber, ich vermute mal (hab nachgelesen )

Zitat von der zweite Paramweter:
The Unicode version of this function, CreateProcessW, can modify the contents of this string. Therefore, this parameter cannot be a pointer to read-only memory (such as a const variable or a literal string). If this parameter is a constant string, the function may cause an access violation.

The lpCommandLine parameter can be NULL. In that case, the function uses the string pointed to by lpApplicationName as the command line.
$2B or not $2B

Geändert von himitsu (24. Feb 2012 um 23:15 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:19 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz