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.