Hallo,
ich habe folgende Procedure um eine Datei zu starten und dessen Fenster zu verstecken:
Delphi-Quellcode:
procedure start_Process(const FileName: String; out HWindow: HWND; out Process: Cardinal);
function EnumWindowsProc(hWnd: HWND; lParam: LPARAM): BOOL; stdcall;
begin
TList(lParam).Add(Pointer(hWnd));
Result := True;
end;
var
i : Integer;
StartupInfo: TStartupInfo;
ProcessInfo: TProcessInformation;
List : TList;
ProcessId : DWORD;
begin
If not FileExists(FileName) then
exit;
List := TList.Create;
try
//Variable mit nullen auffüllen und Größe setzen
FillChar(StartupInfo, SizeOf(TStartupInfo), 0);
StartupInfo.cb := SizeOf(TStartupInfo);
StartupInfo.dwFlags := STARTF_USESHOWWINDOW;
StartupInfo.wShowWindow := SW_HIDE;
If CreateProcess(nil, PChar(FileName + #0), nil, nil, false, 0, nil, nil,
StartupInfo, ProcessInfo) then
begin
WaitForInputIdle(ProcessInfo.hProcess, INFINITE);
If EnumWindows(@EnumWindowsProc, Integer(List)) then
for i := 0 to Pred(List.Count) do
begin
GetWindowThreadProcessId(Integer(List.Items[i]), ProcessId);
If ProcessInfo.dwProcessId = ProcessId then
begin
HWindow := Integer(List.Items[i]);
Process := ProcessInfo.hProcess;
break;
end;
end;
CloseHandle(ProcessInfo.hProcess);
CloseHandle(ProcessInfo.hThread);
end;
finally
//Liste löschen und freigeben
FreeAndNil(List);
end;
end;
Diese Funktion nutz ich um den Exenamen zu erhalten:
Delphi-Quellcode:
function GetProcessExeName(hProcess: THandle): String;
var
lpBuffer: array[0..MAX_PATH -1] of Char;
begin
ZeroMemory(@lpBuffer, SizeOf(lpBuffer));
If GetModuleFileNameEx(hProcess, 0, lpBuffer, SizeOf(lpBuffer)) > 0 then
Result := String(lpBuffer)
else
Result := SyserrorMessage(GetlastError);
end;
Und diese Funktion um den Titel auszulesen:
Delphi-Quellcode:
function GetWindowText(Wnd: HWND): String;
var
WndCaption: PWideChar;
len: Integer;
begin
len := SendMessage(Wnd, WM_GETTEXTLENGTH, 0, 0);
If len > 0 then
begin
len := len * 2;
WndCaption := GetMemory(len + 1);
If Assigned(WndCaption) then
begin
SendMessageW(Wnd, WM_GETTEXT, len + 1, Integer(WndCaption));
Result := String(WndCaption);
FreeMemory(WndCaption);
end;
end;
end;
Ich hab jetzt das Problem, welchen
Handle ich zu welcher Funktion nutze.
Also für die letzte Funktion kann ich dieses
Handle nutzen aus der ersten Procedure
HWindow := Integer(List.Items[i]);
Nur welches
Handle brauch ich für die zweite Funktion?
Ich hab es mit beiden ausprobiert, aber jedesmal erhalte ich als Systemfehlermeldung "
Handle ungültig"
Wen muss man bestechen um eine ordentliche Codeformatierung zu erhalten?