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