Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Fremd Anwendung im Panel kontrollieren (https://www.delphipraxis.net/133710-fremd-anwendung-im-panel-kontrollieren.html)

TUX_der_Pinguin 7. Mai 2009 10:55


Fremd Anwendung im Panel kontrollieren
 
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;

quendolineDD 7. Mai 2009 11:07

Re: Fremd Anwendung im Panel kontrollieren
 
Code ist zwar in VB und das Forum auf Englisch, jedoch allgemein versätndlich.
guckst du hier.

TUX_der_Pinguin 7. Mai 2009 12:37

Re: Fremd Anwendung im Panel kontrollieren
 
Also sorry, aber den VB Code habe ich nicht kapiert, ich hab nur soweit verstanden das da irgendwelche
Messages abgefangen werden sollen. Aber wie mir das weiter helfen soll weiß ich immer noch nicht.

quendolineDD 7. Mai 2009 13:06

Re: Fremd Anwendung im Panel kontrollieren
 
Die Kommentare der Leute sind wichtig.
Auf der einen Seite schreiben sie, dass man über das Handle des anderen Prozesses herausfinden kann, ob dieser noch läuft. Auf der anderen Seite meinen sie, man könne ein WH_SHELL Hook installieren um dann eine Nachricht zu erhalten, wenn ein Fenster zerstört wird (via HSHELL_WINDOWDESTROYED). Wäre zwar kein overhed für die Schleife, welche andauernd pollt, dafür aber der größere Aufwand über den Hook.

DevilsCamp 7. Mai 2009 13:38

Re: Fremd Anwendung im Panel kontrollieren
 
Ich hätte jetzt MSDN-Library durchsuchenCreateProcess und MSDN-Library durchsuchenWaitForSingleObject vorgeschlagen.
In einem Parameter von CreateProcess erhältst du die PID des gestarteten Prozesses, mit deren Hilfe du dann WaitForSingleObject nutzen kannst um so auf das Beenden des gestarteten Prozesses zu warten.

quendolineDD 7. Mai 2009 13:49

Re: Fremd Anwendung im Panel kontrollieren
 
Damit sperrt er sich ja den Hauptthread seines eigenen Programmes. Das wäre keine Lösung.

DevilsCamp 7. Mai 2009 14:03

Re: Fremd Anwendung im Panel kontrollieren
 
Zitat:

Zitat von quendolineDD
Damit sperrt er sich ja den Hauptthread seines eigenen Programmes. Das wäre keine Lösung.

Das könnte man durch Verwendung von Threads umgehen.

quendolineDD 7. Mai 2009 14:10

Re: Fremd Anwendung im Panel kontrollieren
 
Macht sich bloß dumm, wenn man im Thread einen Prozess startet um ihm dann vom Hauptthread (der VCL) heraus aufrufen zu wollen.
Ich würd sagen, mach ein Shell Hook und fertig.

TUX_der_Pinguin 7. Mai 2009 14:12

Re: Fremd Anwendung im Panel kontrollieren
 
Mit Shell Hook meinst du die Message abfangen das die Anwendung beendet wurde?

Hast du evtl. nen Ansatz für mich da ich zur Zeit da noch völlig auf dem Schlauch stehe. :gruebel:

quendolineDD 7. Mai 2009 14:26

Re: Fremd Anwendung im Panel kontrollieren
 
Schau mal nach Asserbard's Hook Tutorial.
Auf www.michael-puff.de findest du sein Tutorial


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:45 Uhr.
Seite 1 von 2  1 2      

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