![]() |
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; |
Re: Fremd Anwendung im Panel kontrollieren
|
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. |
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. |
Re: Fremd Anwendung im Panel kontrollieren
Ich hätte jetzt
![]() ![]() 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. |
Re: Fremd Anwendung im Panel kontrollieren
Damit sperrt er sich ja den Hauptthread seines eigenen Programmes. Das wäre keine Lösung.
|
Re: Fremd Anwendung im Panel kontrollieren
Zitat:
|
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. |
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: |
Re: Fremd Anwendung im Panel kontrollieren
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:45 Uhr. |
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