![]() |
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. |
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.
|
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 |
Re: minimiertes Fenster einer Fremdanwendung aufblenden
Vielleicht hilft dir das ja weiter:
![]() |
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? |
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: |
Re: minimiertes Fenster einer Fremdanwendung aufblenden
Zitat:
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 |
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 :) ) |
Re: minimiertes Fenster einer Fremdanwendung aufblenden
Zitat:
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:
So habe ich ja auch das passende Handle. Nur ein
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;
Delphi-Quellcode:
führt eben zu dem genannten Effekt.
ShowWindow(Wnd, SW_RESTORE);
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. |
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 21:48 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 by Thomas Breitkreuz