Einzelnen Beitrag anzeigen

TUX_der_Pinguin

Registriert seit: 1. Jun 2005
Ort: Anholt (NRW)
609 Beiträge
 
Delphi 11 Alexandria
 
#1

Fremd Anwendung im Panel kontrollieren

  Alt 7. Mai 2009, 11:55
Ich habe ein problem ich möchte gern eine Anwendung starten und diese in einem Panel anzeigen, was auch schon klappt.
Jedoch frage ich mich wie kann mein Programm merken ob die gestartete Anwendung beendet wurde um anschließend das
Panel wieder zu entfernen.

Das Ziel ist ein kompl. abgeschlossenes System (Kioskmodus), sprich meine Anwendung liegt im Vordergrund und nichts
ist machbar um an das dahinter liegende Windows zu kommen. Ich habe meine Anwendung dazu als Shell eingebunden, wie ich
die einzelnen funktionen wie Taskmanager, Hotkeys etc. unterbinde darum kümmere ich mich später.

In meiner Anwendung sollen bestimmte Programme aufgerufen werden können, unter anderem auch Dos Anwendungen.
Dazu erstelle ich ein Panel welches ich über das Fenster lege im Vollbildmodus so ist nur noch das Panel zu
sehen dann wird die externe Anwendung gestartet und per SetParent an das Panel gebunden, so jetzt der haken,
wird die externe Anwendung beendet soll mein Programm das mit bekommen und daraufhin das Panel entfernen, nur wie?

Also eine möglichkeit wäre das eine schleife läuft und prüft ob das Programm noch aktiv ist nur sobald ich das
Programm mit SetParent ins Panel "einsperre" funktioniert FindWindow nicht mehr.

Im folgenden Auszug steht wie ich bisher eine externe Anwendung aufrufe und auf einem zuvor erstellten Panel
einbinde, jedoch fehlt der teil wie ich nach beenden der Anwendung wieder das Panel entferne.

Delphi-Quellcode:
procedure TfrmMain.Button2Click(Sender: TObject);
var
  aWnd : HWND;
  WPM : TWindowPlacement;
  i : Integer;
  AppPanel : TPanel;
  
begin
  //Panel erstellen
  AppPanel := TPanel.Create(Self);
  AppPanel.Parent := frmMain;
  AppPanel.BoundsRect := frmMain.BoundsRect;
  AppPanel.Caption := 'Anwendung wird gestartet...';

  //ext. Anwendung aufrufen...
  ShellExecute(Application.Handle, 'open', 'D:\TA\TA.exe', nil, 'D:\TA\', SW_MAXIMIZE);

  //Solange warten bis Programm gestartet wurde
  aWnd := FindWindow(nil, 'TA.EXE');
  while aWnd = 0 do aWnd := FindWindow(nil, 'TA.EXE');


  if aWnd <> 0 then begin
    //Programm in Panel einbetten ...
    Windows.SetParent(aWnd, AppPanel.Handle);

    //Fenster maximiert darstellen, bringt bei einer Dos Anwendung nichts.
    WPM.length := SizeOf(WPM);
    GetWindowPlacement(aWnd, @WPM);
    WPM.showCmd := SW_SHOWMAXIMIZED;
    WPM.rcNormalPosition := Classes.Rect(0,0, AppPanel.Width, AppPanel.Height);
    SetWindowPlacement(aWnd, @WPM);
  end
  else begin
    AppPanel.Caption := 'Anwendung konnte nicht gestartet werden...';
    AppPanel.Free;
  end;

end;
  Mit Zitat antworten Zitat