AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi minimiertes Fenster einer Fremdanwendung aufblenden
Thema durchsuchen
Ansicht
Themen-Optionen

minimiertes Fenster einer Fremdanwendung aufblenden

Ein Thema von MisterCP · begonnen am 27. Feb 2009 · letzter Beitrag vom 22. Apr 2009
Antwort Antwort
Seite 1 von 2  1 2      
MisterCP

Registriert seit: 24. Jan 2008
14 Beiträge
 
#1

minimiertes Fenster einer Fremdanwendung aufblenden

  Alt 27. Feb 2009, 12:49
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? )

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.
  Mit Zitat antworten Zitat
SimStar001

Registriert seit: 18. Jan 2008
594 Beiträge
 
#2

Re: minimiertes Fenster einer Fremdanwendung aufblenden

  Alt 27. Feb 2009, 13:00
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.
Marco Tröger
  Mit Zitat antworten Zitat
MisterCP

Registriert seit: 24. Jan 2008
14 Beiträge
 
#3

Re: minimiertes Fenster einer Fremdanwendung aufblenden

  Alt 27. Feb 2009, 13:12
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
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.021 Beiträge
 
Delphi 12 Athens
 
#4

Re: minimiertes Fenster einer Fremdanwendung aufblenden

  Alt 27. Feb 2009, 13:56
Vielleicht hilft dir das ja weiter: The Old New Thing
Uwe Raabe
  Mit Zitat antworten Zitat
MisterCP

Registriert seit: 24. Jan 2008
14 Beiträge
 
#5

Re: minimiertes Fenster einer Fremdanwendung aufblenden

  Alt 5. Mär 2009, 12:40
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?
  Mit Zitat antworten Zitat
MisterCP

Registriert seit: 24. Jan 2008
14 Beiträge
 
#6

Re: minimiertes Fenster einer Fremdanwendung aufblenden

  Alt 6. Mär 2009, 10:56
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 ...
  Mit Zitat antworten Zitat
Schwedenbitter

Registriert seit: 22. Mär 2003
Ort: Finsterwalde
622 Beiträge
 
Turbo Delphi für Win32
 
#7

Re: minimiertes Fenster einer Fremdanwendung aufblenden

  Alt 22. Apr 2009, 12:00
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
Alex Winzer
  Mit Zitat antworten Zitat
MisterCP

Registriert seit: 24. Jan 2008
14 Beiträge
 
#8

Re: minimiertes Fenster einer Fremdanwendung aufblenden

  Alt 22. Apr 2009, 16:15
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 )
  Mit Zitat antworten Zitat
Schwedenbitter

Registriert seit: 22. Mär 2003
Ort: Finsterwalde
622 Beiträge
 
Turbo Delphi für Win32
 
#9

Re: minimiertes Fenster einer Fremdanwendung aufblenden

  Alt 22. Apr 2009, 17:38
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 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.
Alex Winzer
  Mit Zitat antworten Zitat
MisterCP

Registriert seit: 24. Jan 2008
14 Beiträge
 
#10

Re: minimiertes Fenster einer Fremdanwendung aufblenden

  Alt 22. Apr 2009, 17:52
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}
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 10:47 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