Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Programm öffnen und Handle erhalten (https://www.delphipraxis.net/103161-programm-oeffnen-und-handle-erhalten.html)

Helmi 11. Nov 2007 15:13


Programm öffnen und Handle erhalten
 
Hallo,

wie man ein Programm öffnet weiss ich ja:

Delphi-Quellcode:
procedure OpenFile(FileName: string);
var
  c: array[0..800] of Char;
begin
  StrPCopy(c, FileName);
  ShellExecute(Application.Handle, 'open', c, nil, nil, SW_NORMAL);
end;

Nur wie bekomm ich nun das Handle des geöffneten Programmes zurück?

DeddyH 11. Nov 2007 15:17

Re: Programm öffnen und Handle erhalten
 
Schau Dir mal CreateProcess oder ShellExecuteEx an.

bluescreen25 11. Nov 2007 21:12

Re: Programm öffnen und Handle erhalten
 
Delphi-Quellcode:
...
var ProcID : Cardinal;
    WND : HWnd;
...


function RunProcess(FileName: string; ShowCmd: DWORD; wait: Boolean; ProcID: PDWORD): Longword;
var
  StartupInfo: TStartupInfo;
  ProcessInfo: TProcessInformation;
  ExitInfo  : PExitThreadDebugInfo;
begin
  FillChar(StartupInfo, SizeOf(StartupInfo), #0);
  StartupInfo.cb         := SizeOf(StartupInfo);
  StartupInfo.dwFlags    := STARTF_USESHOWWINDOW or STARTF_FORCEONFEEDBACK;
  StartupInfo.wShowWindow := ShowCmd;


  if not CreateProcess(nil,@Filename[1],nil,nil,False,CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS,nil,nil,StartupInfo,ProcessInfo) then
  Result := WAIT_FAILED
  else
  begin
    if wait = FALSE then
    begin
      if ProcID <> nil then ProcID^ := ProcessInfo.dwProcessId;
      exit;
    end;
    WaitForSingleObject(ProcessInfo.hProcess, INFINITE);
    GetExitCodeProcess(ProcessInfo.hProcess, Result);
  end;
  if ProcessInfo.hProcess <> 0 then
    CloseHandle(ProcessInfo.hProcess);
  if ProcessInfo.hThread <> 0 then
    CloseHandle(ProcessInfo.hThread);
end;
Delphi-Quellcode:
function GetWndHandle(ProcessId: DWORD): HWND;
 var
  List: TList;
   I: Integer;
   PID: DWORD;
 begin
   Result := 0;
   List := TList.Create;
     try
       EnumWindows(@EnumWindowsProc, LPARAM(List));
       for I := 0 to List.Count - 1 do
        if GetWindowThreadProcessId(HWND(List.Items[I]), @PID) <> 0 then
        if PID = ProcessId then
          begin
            Result := HWND(List.Items[I]);
            Break;
          end;
       finally
        List.Free;
     end;
 end;
Delphi-Quellcode:
function EnumWindowsProc(hWnd: HWND; lParam: LPARAM): BOOL; stdcall;
 begin                                  //bei Win95/98 evt problematisch
  TList(lParam).Add(Pointer(hWnd));
  Result := True;
 end;
Aufruf z.B.

Delphi-Quellcode:
...
RunProcess('C:\programm.exe', SW_SHOW, FALSE, @ProcID);

repeat
  WND := GetWndHandle(ProcID);//warten bis gestartet bzw gefunden über ProcID
  application.ProcessMessages;    
  sleep(500);                      
until (WND <> 0);//or stopSearch; hier ggf einen Timer mitlaufen lassen, der nach x sek die Suche beendet


if (WND <> 0) then
 begin
   ...dein Code...was mit Handle zu machen ist wie z.B.
   BringWindowToTop(WND);
 end;
Falls du im Nachhinein nochmal Fenster einfangen musst, gibt es eigendlich eine bessere GetWndHandle Funktion, die etwas genauer arbeitet...


Gruß, bluescreen25

Nuclear-Ping 11. Nov 2007 22:15

Re: Programm öffnen und Handle erhalten
 
Zitat:

Zitat von bluescreen25
Delphi-Quellcode:
...
repeat
  ...
  application.ProcessMessages;
  sleep(500);                      
until (WND <> 0);//or stopSearch; hier ggf einen Timer mitlaufen lassen, der nach x sek die Suche beendet

Wozu noch Sleep? Ist in dem Fall doch eher hinderlich?

bluescreen25 12. Nov 2007 14:22

Re: Programm öffnen und Handle erhalten
 
Zitat:

Zitat von Nuclear-Ping
Zitat:

Zitat von bluescreen25
Delphi-Quellcode:
...
repeat
  ...
  application.ProcessMessages;
  sleep(500);                      
until (WND <> 0);//or stopSearch; hier ggf einen Timer mitlaufen lassen, der nach x sek die Suche beendet

Wozu noch Sleep? Ist in dem Fall doch eher hinderlich?

Ich hatte das in einer Hauptanwendung, wo das Starten und Einfangen der ext. Anwendungen nicht den Vorrang hat. Die Anwendung sollte flüssig laufen und darüber hinaus fragt das Starten einer ext. Anwendung zusätzlich CPU-Last ab. Und nochmals darüber hinaus muss ich nicht durch die Schleife nochmals blockieren bzw entweder meine Anwendung stören oder das Starten der ext. verzögern, so wird nur alle 500ms einmal geschaut obs Handle da ist, viele Anwendungen brauchen eh länger für den Start.

Für meine Zwecke hatte das Vorteile.

Gruß bluescreen25


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:06 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz