Einzelnen Beitrag anzeigen

Schwedenbitter

Registriert seit: 22. Mär 2003
Ort: Finsterwalde
622 Beiträge
 
Turbo Delphi für Win32
 
#3

AW: ShellExecute und Vordergrund

  Alt 11. Jan 2011, 11:06
Nimm entweder CreateProcess oder ShellexecuteEx.
Danke für den Tip. Ich habe das so versucht und ich habe auch schon die DP durchstöbert:
Delphi-Quellcode:
procedure TForm1.Memo1Click(Sender: TObject);
var
  ShExecInfo : SHELLEXECUTEINFO;
begin
  FillChar(ShExecInfo, SizeOf(SHELLEXECUTEINFO), 0);
  ShExecInfo.cbSize:=SizeOf(SHELLEXECUTEINFO);
  ShExecInfo.fMask:= SEE_MASK_NOCLOSEPROCESS;
  ShExecInfo.Wnd:= self.Handle;
  ShExecInfo.lpVerb:='open';
  ShExecInfo.lpFile:=PChar('calc.exe');
  ShExecInfo.nShow:= SW_NORMAL Or SW_SHOWDEFAULT;
  ShellExecuteEx(@ShExecInfo);
  Memo1.Lines.Append('ShellExecuteEx:' + #09 + IntToStr(ShExecInfo.hProcess));
end;
Wenn ich das richtig verstehe, dann habe ich jetzt die Process-ID. Wie komme ich aber an das Fenster-Handle ran, damit ich mit den mir bekannten Funktionen das Fenster in den Vordergrund zwingen kann?

ShExecInfo.Wnd , wie man anhand dieses Posts annehmen sollte, dürfte es nicht sein. Denn bei mir ist das immer 0. Und mit diesem Code (function GetWndHandle(ProcessId: DWORD): HWND; ) erhalte ich auch immer nur 0.
Wenn ich das richtig verstehe, muss ich "nur" die Handles aller Fenster ermitteln, deren Process-IDs mittels GetWindowThreadProcessId() herausbekommen. Wenn dann eine der ermittelten mit ShExecInfo.hProcess übereinstimmt, habe ich mein Handle? Kann mir da bitte, bitte jemand mal Code oder einen Links posten? Ich habe bereits mehrere Themen dazu durchgelesen, steige aber nicht wirklich dahinter, wie ich EnumWindows verwenden muss. Ich habe zwar Code gefunden, wie man Fenster schließen kann, schaffe es aber nicht, den so umzustellen, dass ich stattdessen das Handle erhalte...

Wenn ich die Themen hier richtig verstanden habe, muss ich dann am Schluss auch noch CloseHandle(ShExecInfo.hProcess); aufrufen, oder?

Gruß, Alex
Alex Winzer
  Mit Zitat antworten Zitat