Einzelnen Beitrag anzeigen

Benutzerbild von Helmi
Helmi

Registriert seit: 29. Dez 2003
Ort: Erding, Republik Bayern
3.312 Beiträge
 
Delphi XE2 Professional
 
#1

Problem mit Zuordnung der Handle eines Processes

  Alt 7. Mär 2012, 17:45
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?
mfg
Helmi

>> Theorie ist Wissen, dass nicht funktioniert - Praxis ist, wenn alles funktioniert und keiner weiss warum! <<

Geändert von Helmi ( 7. Mär 2012 um 17:57 Uhr)
  Mit Zitat antworten Zitat