Fenster nach minimieren wieder anzeigen
-
Hallo,
ich wollte mein Programm ins tray minimieren. Das klappt auch ganz gut. Danach möchte ich das Programm mit Doppelklick wieder anzeigen, das klappt zwar auch aber nur im Hintergrund. Kann mir jemand sagen wie ich das Programm im Vordergrund anzeigen kann? Danke im Voraus.
Problem:
Fenster wird im Hintergrund geöffnet und nicht im Vordergrund.void __fastcall TForm1::FormShow(TObject *Sender) { Application->OnMinimize = OnMinimize; } //--------------------------------------------------------------------------- void __fastcall TForm1::OnMinimize(TObject *Sender) { // Fenster von Taskleiste verschwenden. Hide(); } //--------------------------------------------------------------------------- void __fastcall TForm1::TrayIcon1DblClick(TObject *Sender) { // Fenster anzeigen Visible = true; // Methode 1 Show(); // Methode 2 ShowWindow(Application->Handle, SW_SHOW); // Methode 3 SetForegroundWindow(this->Handle); // Methode 4 Application->BringToFront(); // Methode 5 } //---------------------------------------------------------------------------
-
Welches Fenster soll denn im Vordergrund sein? Wenn ich bspw. für Form1
ShowWindow(Form1->Handle, SW_SHOW);
schreibe, ist das dann bei mir auch im Vordergrund. Du gibt's bei Methode 3 aber "nur" das Handle der Application an und dein Formular bleibt invisible, da du es ja vorher verborgen hast.
Oder du schreibst:Visible = true; //und (!) ShowWindow(Application->Handle, SW_SHOW);
sollte auch gehen..
EDIT: eine nette Ergänzung dazu vllt aus einem Zitat von WebFritzi:
In jedem BCB-GUI-Projekt gibt es eine globale Variable "Application". Diese ist eine Instanz von TApplication und steht für die Anwendung an sich. Application besitzt ein Fenster, das viele nicht kennen. Es ist "versteckt" und ist das Owner-Fenster aller Formulare. Der Button in der Taskleiste bei gestarteter Anwendung gehört zu ihm - nicht zu einer Form.
-
Im Hintergrund von welchem Fenster? Wenn es sich bei dem Fenster um ein "topmost window" handelt, dann bleibt dein Fenster hinter diesem Fenster.
Oder wird dein Fenster gar nicht mehr angezeigt? Dann liegt es wohl daran, daß der "WindowState" noch auf "Minimize" steht und du das Fenster wieder im Normalzustand anzeigen mußt:WindowState = wsNormal;
Und lies auch mal How to Restore a Delphi Form from Minimized / Maximized state to the Previous State, Programmatically! .
-
@drummi
Mein Programm hat nur diese eine Fenster. Ansonsten sind dann zum Beispiel Microsoft Word, Notepad++ usw. geöffnet. Wenn ich dannShowWindow(Form1->Handle, SW_SHOW);
oder
Visible = true; //und (!) ShowWindow(Application->Handle, SW_SHOW);
aufrufe wird mein Programm im Hintergrund geöffnet. So das ich das Programm in der Taskleiste anklicken muss und danach erst erscheint das Programm im Vordergrund und man kann damit arbeiten. Denn wenn Notepad++ im Vordergrund ist kann ich ja schlecht mein Programm benutzen. Hoffe jetzt ist klar welches Fenster im Vordergrund erscheinen soll.
Frage:
Funktioniert der Code bei euch? Erscheint nach dem Minimieren das Programm bei euch im Vordergrund? Hat eine es ausprobiert?
-
@th69 Das hat leider auch nicht geholfen.
-
Hast du denn jeweils nur genau eine der 5 Methoden ausprobiert?
Du mußt natürlich zuerst das Fenster anzeigen lassen und danach dann in den Vordergrund bringen.Zur Info: In einem C# Tray-Projekt benutze ich zuverlässig folgendes:
if (!Visible) { Visible = true; WindowState = FormWindowState.Normal; Activate(); }
(sollte also im Prinzip auch so mit der VCL umsetzbar sein)
-
Eventuell ist es auch eine eigenart von Windows selbst.
Ich hatte schon einigemale folgendes phänomen gehabt:
Hatte im Explorer eine kopieraktion angestoßen und der Kopier-Fortschrittsdialog wurde dabei nicht im Vordergrund geöffnet
-
Wichtig ist, daß bei "BringToFront" das Fenster selbst schon den Fokus hat (also "active" ist), ansonsten erscheint der Flash-Effekt beim Taskbar-Button (d.h. das orange Blinken).
Und genau dies erledigt dann in .NET dieActivate()
-Methode.
-
@th69 Ich habe alles mögliche ausprobiert. Einzel, alle hintereinander in unterschiedliche Reihenfolge. Alle Handels ausgetauscht mal Application->Handle mal this->Handle. Und deine Methode von C# ebenfalls. Leider kein Erfolg.
-
@th69 gerade ausprobiert und es hat nicht geholfen.
-
@firefly Ja die vermutung habe ich auch.
-
Welches Windows benutzt du denn?
Ich habe noch Windows 7 und da funktioniert es ja mit meinem .NET-Programm (das ja intern auch nur die WinAPI benutzt).
-
@th69 Windows 10
-
Hier ist eine Routine in Delphi, die lässt sich auch leicht in C++ umsetzen: