![]() |
Problem mit Zuordnung der Handle eines Processes
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:
Ich hab jetzt das Problem, welchen Handle ich zu welcher Funktion nutze.
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; Also für die letzte Funktion kann ich dieses Handle nutzen aus der ersten Procedure
Delphi-Quellcode:
Nur welches Handle brauch ich für die zweite Funktion?
HWindow := Integer(List.Items[i]);
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? |
AW: Problem mit Zuordnung der Handle eines Processes
Sagt doch schon der Datentyp: HWD, ein Fenster Handle, welches man mit FindWindow oder EnumWindows bekommt.
|
AW: Problem mit Zuordnung der Handle eines Processes
Argl!
Ich komm einfach ins Alter! Ich meinte natürlich nicht die letzte Funktion sondern die zweite! Ich werds oben korrigieren |
AW: Problem mit Zuordnung der Handle eines Processes
Das sollte eigentlich das Prozesshandle sein, also das, was Du in Process ausgibst.
|
AW: Problem mit Zuordnung der Handle eines Processes
Zitat:
|
AW: Problem mit Zuordnung der Handle eines Processes
Vielleicht wird das u.U. nicht zugewiesen, initialisiert ist es ja auch nicht. Setz doch die Zeile
Zitat:
|
AW: Problem mit Zuordnung der Handle eines Processes
Zitat:
|
AW: Problem mit Zuordnung der Handle eines Processes
Könnte das mit dem CloseHandle zusammenhängen?
|
AW: Problem mit Zuordnung der Handle eines Processes
Zitat:
Das war das Problem! - Irgendwie logisch! Dank dir! |
AW: Problem mit Zuordnung der Handle eines Processes
Nicht weitersagen: ich bin da auch erst drauf gekommen, nachdem ich nochmal im MSDN unter CreateProcess nachgeschaut hatte und das CloseHandle mir dann in den Bemerkungen ins Auge sprang :zwinker:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:16 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz