AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Programm öffnen und Handle erhalten

Ein Thema von Helmi · begonnen am 11. Nov 2007 · letzter Beitrag vom 12. Nov 2007
Antwort Antwort
Benutzerbild von Helmi
Helmi

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

Programm öffnen und Handle erhalten

  Alt 11. Nov 2007, 16:13
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?
mfg
Helmi

>> Theorie ist Wissen, dass nicht funktioniert - Praxis ist, wenn alles funktioniert und keiner weiss warum! <<
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.619 Beiträge
 
Delphi 12 Athens
 
#2

Re: Programm öffnen und Handle erhalten

  Alt 11. Nov 2007, 16:17
Schau Dir mal CreateProcess oder ShellExecuteEx an.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
bluescreen25

Registriert seit: 27. Nov 2005
Ort: Geldern
229 Beiträge
 
Delphi 7 Enterprise
 
#3

Re: Programm öffnen und Handle erhalten

  Alt 11. Nov 2007, 22:12
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
...und ich dachte, Delphi ist ein Programmgenerator mit nur einem Button......tzzz
  Mit Zitat antworten Zitat
Nuclear-Ping
(Gast)

n/a Beiträge
 
#4

Re: Programm öffnen und Handle erhalten

  Alt 11. Nov 2007, 23:15
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?
  Mit Zitat antworten Zitat
bluescreen25

Registriert seit: 27. Nov 2005
Ort: Geldern
229 Beiträge
 
Delphi 7 Enterprise
 
#5

Re: Programm öffnen und Handle erhalten

  Alt 12. Nov 2007, 15:22
Zitat von Nuclear-Ping:
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
...und ich dachte, Delphi ist ein Programmgenerator mit nur einem Button......tzzz
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:43 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