Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi minimiertes Fenster einer Fremdanwendung aufblenden (https://www.delphipraxis.net/129896-minimiertes-fenster-einer-fremdanwendung-aufblenden.html)

MisterCP 27. Feb 2009 13:49


minimiertes Fenster einer Fremdanwendung aufblenden
 
Hi,

nachdem ich hier zwar ein dem Grunde nach sehr ähnliches Thema gefunden habe (topic131920), dieses aber die eigentliche Lösung auch nicht enthält, dafür aber schon etwas älter ist, hoffe ich mal auf neu Ideen zur Problematik.

Hintergrund: auf einem Rechner mit Touchscreen läuft als permanente Vordergrundanwendung mein Programm im Vollbild und die Taskleiste ist ausgeblendet. Lediglich zeitweise soll per Tatsendruck eine fremde Anwendung für einige Zeit in den Vordergrund gebracht werden.

Selbige Anwendung wechselt allerding je nach akt. angezeigtem Inhalt ihre Titelleiste, daher erfolgt die Suche nach dem Programm über dessen Exe-Namen. (Fensterhandle über CreateToolHelp32Snapshot und ProcID2hWnd).

Allerdings scheint es dabei nicht immer ganz nachvollziehbar mit rechten Dingen zuzugehen, denn schon
IsIconic(AISErr_hWnd)
zeigt nicht zuverlässig an, daß das Fenster minimiert ist.
Inzwischen habe ich auch schon rausbekommen, daß die minimierte Anwendung ein anderes Handle hat, als die aufgeblendete??? (WARUM? :gruebel: )

die dann folgenden Befehle
ShowWindow(AISErr_hWnd, SW_RESTORE);
bzw.
WinPosErr := SetWindowPos(AISErr_hWnd, HWND_TOPMOST, 0, 100, 800, 400, SWP_SHOWWINDOW);
bringen den gewünschten Erfolg bei NICHT minimiertem Fenster in jedem Fall, bei tatsächlich minimiertem Fenster nur in 10-20% der Wechselversuche.

Kann mir jemand sagen was ich falsch mache, bzw. ob es einen besseren weil sichereren Weg gibt?

Vielen Dank schon mal im Vorraus.

SimStar001 27. Feb 2009 14:00

Re: minimiertes Fenster einer Fremdanwendung aufblenden
 
Wenn du das Window Handle gefunden hast, dann prüfe doch zusätzlich noch den Window State der Anwendung. Wenn dieser auf "Minimieren" gesetzt ist, solltest du dir dann sicher sein können dass es die gewünschte anwendung/fenster ist. und wenn es schon offen ist genau anders herum.

MisterCP 27. Feb 2009 14:12

Re: minimiertes Fenster einer Fremdanwendung aufblenden
 
das richtige Fenster ist es in jedem Fall, das ist nicht das Problem.
(die entsprechende exe kann definitiv nur einmal gestartet werden)

Mein Problem ist, das ich es nicht wieder in den Vordergrund bekomme wenn es minimiert ist

Uwe Raabe 27. Feb 2009 14:56

Re: minimiertes Fenster einer Fremdanwendung aufblenden
 
Vielleicht hilft dir das ja weiter: The Old New Thing

MisterCP 5. Mär 2009 13:40

Re: minimiertes Fenster einer Fremdanwendung aufblenden
 
Zunächst mal Danke für die Antworten, auch wenn die Lösung noch nicht dabei war.

Habe aber mit den Infos ein wenig weiter geforscht mit den folgenden Ergebnissen:

Die Prüfung des WindowState ergibt
manchmal 1 = SW_SHOWNORMAL, dann funktioniert das Anzeigen nicht, egal was ich anstelle
manchmal 2 = SW_SHOWMINIMIZED, dann funktioniert das Anzeigen mit ShowWindow(AISErr_hWnd, SW_RESTORE);

In beiden Fällen war aber die fremde Anwendung zuvor per Mausklick minimiert worden.

Stellt sich die Frage, wieso eine offensichtlich minimierte Anwendung den Windowstate 1 haben kann, wenn man sie doch auf dem Desktop nicht sieht.
Deshalb hab ich mir auch gleich über "WPlacement" noch die Fensterposition mit anzeigen lassen, die liegt voll im Anzeigebereich.
(0; 100; 800; 500)

Achja, wenn ich den Spaß mit notepad als Fremdanwendung probiere tritt das Problem nie auf.

Jetzt hilft es mir leider nicht weiter daß meine Fremdanwendung offensichtlich Teil des Problems ist, denn irgendwie schafft es Windows ja auch, das Teil wieder in Fordergrund zu bringen. (für ms schafft es ShowWindows auch, nur dann ist es gleich wieder weg)

Kann es u.U. an speziellen Anforderungen eines MDI-Formulars liegen und wie wären die zu behandeln?

MisterCP 6. Mär 2009 11:56

Re: minimiertes Fenster einer Fremdanwendung aufblenden
 
Nach vielen Stunden des Suchens bin ich zu folgendem Ergebnis gekommen:

Meine Fremdanwendung sieht zwar nicht aus wie ein MDI-Formular, ist aber offensichtlich trotzdem eines, bzw. wird anscheinend aus mehreren Fenstern zusammengesetzt.

Je nachdem welches (virtuelle?) Fenster gerade aktiv ist hat meine exe ein anderes Handle.

vom minimiert aufblenden kann ich aber irgendwie nur das Hauptformular.

Wenn ich allerding ein Unterformular gefunden habe erhalte ich trotzdem mit GETPARENT eine "0" was mich bisher darauf schließen ließ das ich mit dem Hauptformular arbeite.

Muß ich mal noch eine weile weiter probieren ... :gruebel:

Schwedenbitter 22. Apr 2009 13:00

Re: minimiertes Fenster einer Fremdanwendung aufblenden
 
Zitat:

Zitat von MisterCP
Die Prüfung des WindowState ergibt
manchmal 1 = SW_SHOWNORMAL, dann funktioniert das Anzeigen nicht, egal was ich anstelle
manchmal 2 = SW_SHOWMINIMIZED, dann funktioniert das Anzeigen mit ShowWindow(AISErr_hWnd, SW_RESTORE);

Kann mir mal bitte jemand schreiben, wie man WindowState abfragt. Wohl gemerkt: Es geht nicht um mein Programm. Form1.WindowState hilf mir also nicht weiter.

Ich habe ein ähnliches Problem und eine weitere, damit verbundene Frage:
Ich möchte gern ein minimiertes Fenster wieder aus der Taskleiste holen. Allerdings möchte ich, dass es denselben Status hat wie zuvor. Wurde es aus dem Zustand normal minimiert, soll es wieder normal werden. Wurde es aus dem Zustand maximiert in die Taskleiste gelegt, möchte ich es auch wieder maximiert haben ...

Danke, Alex

MisterCP 22. Apr 2009 17:15

Re: minimiertes Fenster einer Fremdanwendung aufblenden
 
mußt nur das Handle deiner fremden Exe bestimmen und dann bekommst du den WinState mit

WinState := GetWindowState(AISErr_hWnd);

(Hoffentlich hast du nur ein Handle :) )

Schwedenbitter 22. Apr 2009 18:38

Re: minimiertes Fenster einer Fremdanwendung aufblenden
 
Zitat:

Zitat von MisterCP
mußt nur das Handle deiner fremden Exe bestimmen und dann bekommst du den WinState mit

WinState := GetWindowState(AISErr_hWnd);

(Hoffentlich hast du nur ein Handle :) )

Dieser weg wird nicht klappen. Zunächst will ich den Firefox vorholen und dann aktualisieren. Das Vorholen an sich klappt ja. Ich habe nur das Problem, dass er mit ein vor dem minimieren maximiertes Fenster nach dem vorholen nicht mehr maximiert anzeigt. Das sieht überhaupt nicht schön aus.
Außerdem soll das Programm auf unterschiedlichen Rechnern laufen. Da muss ich mir die exe-Datei ja jedes Mal erst suchen und Handles gibts beim Firefox mit Sicherheit mehrere.

Bislang löse ich das so:
Delphi-Quellcode:
Procedure BrowserRefresh;
Var
   Wnd         : HWND;
Begin
   Wnd:=FindWindow(nil,'Datenbank - Mozilla Firefox');
   If Wnd<>0 Then
   Begin
      SetForeGroundWindow(Wnd);
      keybd_event(VK_F5,0,0,0);
      keybd_event(VK_F5,0,KEYEVENTF_KEYUP,0);
   End;
End;
So habe ich ja auch das passende Handle. Nur ein
Delphi-Quellcode:
ShowWindow(Wnd, SW_RESTORE);
führt eben zu dem genannten Effekt.

Gruß und Dank, Alex

P.S. Ich habe TurboDelphi 2006, wobei er mit Version 10.0.2288.42451 anzeigt. Entweder gibt es dort die Function GetWindowState nicht implementiert oder ich habe die Unit nicht eingebunden. Die Hilfe kennt die Function jedenfalls nicht.

MisterCP 22. Apr 2009 18:52

Re: minimiertes Fenster einer Fremdanwendung aufblenden
 
Frage 1: wer Ändert denn den FireFox?
Frage 2: warum brauchst du eine eigene App zum aufblenden?
Frage 3: wäre es schlimm, den Firefox nach dem aufblenden grundsätzlich zu maximieren?

Sorry, hab selbst nicht nachgeschaut, war eine eigene (irgendwo gefundene) creation:

Code:
function GetWindowState(Wnd:HWnd):integer;
    var WPlacement : PWINDOWPLACEMENT;
        WRect     : TRect;
        WminPoint : TPoint;
        WmaxPoint : TPoint;
    begin
        GetMem(WPlacement,SizeOf(TWINDOWPLACEMENT));
        WPlacement^.Length:=SizeOf(TWINDOWPLACEMENT);
        if GetWindowPlacement(Wnd,WPlacement) then begin
            Result := WPlacement^.showCmd;
            WRect := WPlacement.rcNormalPosition;
            WminPoint := WPlacement.ptMinPosition;
            WmaxPoint := WPlacement.ptMaxPosition;
            end{erster if-zweig}
        else
            Result:=-1;
        FreeMem(WPlacement);
    end;{procedure}


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:13 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 by Thomas Breitkreuz