PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Hm, Fenster aktivieren und so was


Malte 2
12.08.2002, 23:43
Hi!

Ich hab ein . . . naja . . . nicht direkt Problem, aber eine Sache die besser gehen könnte.

Mein Programm erzeugt in WinMain() mit CreateDialog() ein Fenster aus den Ressourcen. Das Fenster wird mit ShowWindow() und dem Parameter SW_HIDE nach dem Erzeugen versteckt und stattdessen ein Symbol neben der Uhr in der Taskleiste angezeigt. Die Eigenschaft "Sichtbar" ist im Ressourceneditor auf false gesetzt.

Wenn man nun auf dieses Symbol doppelklickt, wird das Fenster mit ShowWindow(hWnd, SW_SHOWNORMAL) angezeigt. Aber: Wenn man das zum ersten mal macht, wird das Fenster nicht aktiviert (das heißt die Titelleiste bleibt grau). Wenn man das Fenster dann wieder in die Taskleiste verbannt (gibt's ne Schaltfläche für, die wieder ShowWindow(hWnd, SW_HIDE) aufruft) und es dann wieder erweckt, klappt alles perfekt, das heißt, dass das Fenster dann aktiviert wird.

Wenn man das Programm startet, sollte eigentlich das vorher laufende Programm auch aktiviert bleiben und das Fenster sollte dann auch beim ersten Start aktiviert werden.

Ich habe herausgefunden, dass, wenn ich "Sichtbar" auf true setze, alles klappt. Die laufende Anwendung bleibt aktiv und das Programm ist auch nach dem ersten Erwachen aktiviert. Das Problem ist nur, dass man das Fenster dann nach dem Start kurz aufblitzen sieht, bis es dann durch ShowWindow(hWnd, SW_HIDE) versteckt wird. Das ist natürlich nicht sooohhh toll.

Gibt's dafür ne Lösung? Ich hab in dem Teil der switch-Anweisung, die die Doppelklicknachricht des Icons der Taskleiste bearbeitet, schon BringWindowToTop(), zweimal ShowWindow(), SetActiveWindow() und so versucht. Alles hat nicht geklappt. Gibt's dafür ne Lösung oder muss ich damit leben, dass das Fenster kurz aufblitzt oder dass es beim ersten Anzeigen nicht aktiv ist?


Patrik Graf
12.08.2002, 23:57
Ich bin mir nicht sicher wie das in C geht, aber in Delphi hat man eine globale Variable namen Application. Da ruft man dann einfach die Methode "BringToFront" auf...

Diese Methode benutzt jedoch SetActiveWindow() und die scheint ja nicht zu funktionieren...

Schwierig schwierig... :confused:

Jan Krüger
13.08.2002, 04:15
du hast das aber so eingerichtet, dass du erst versuchst, das fenster nach vorne zu holen, wenn es auch sichtbar ist. oder? :)

Format C:
13.08.2002, 11:00
SetFocus(hwnd);

hwnd = dein Fenster :)

Malte 2
13.08.2002, 12:30
Schonmal danke! :)

@ JaSt: Klar, das hab ich!

@ Format C: :(

Malte 2
14.08.2002, 22:41
Also ich hab mich jetzt damit abgefunden, dass das Fenster beim Start kurz aufblitzt. Damit hab ich zwei Probleme gelöst:

1) Beim Start wird der Fokus des vorher aktiven Fensters nicht entfernt.
2) Auch beim ersten Anzeigen des Fensters ist es aktiviert.

Nur eine Sache könnte ich noch einbauen. Wenn man das Fenster wieder ausblendet, sodass es nur noch als Symbol in der Taskleiste zu sehen ist, behält das Fenster den Fokus, obwohl in der Online-Hilfe steht, dass, wenn ein Fenster mit ShowWindow(hWnd, SW_HIDE) versteckt wird, der Fokus an das nächste Fenster übergeben wird. Das funktioniert aber bei mir nicht.

Gibt es einen Weg, um den Fokus eines Fensters mit irgendeiner Funktion abzugeben? Ich hab schon SetWindowPos() mit HWND_BOTTOM versucht, aber das hat natürlich nicht geklappt.

Format C:
15.08.2002, 09:52
Geht mit SetFocus(HWND) !

Malte 2
15.08.2002, 11:15
Was soll denn der Fensterparameter sein? Irgendein anderes Fenster (nächstes in der Reihenfolge?) oder was? Es gibt ja Funktionen, die die Handles anderer laufender Fenster ermitteln, aber gibt es keinen einfacheren Weg, mit dem ich meinem Programm selber sage "So, et reischt, zieh disch mal a bissle zurück!" und der Fokus automatisch an das nächste Fenster übergeben wird?

Format C:
15.08.2002, 12:57
?

Welches Fenster soll den den Focus bekommen wenn dein Fenster geschlossen wird ? Das Fenster das vorher den Focus hatte oder was ?

Malte 2
16.08.2002, 00:14
Genau. Muss zwar nicht, aber auf jeden Fall soll irgendein Fenster den Fokus bekommen. Aber es ist wie gesagt am besten, wenn es das vorher aktive Fenster ist.

Format C:
16.08.2002, 12:11
Bevor dein Fenster gezeichnet wird hole mit hwndPev = GetFocus(); den Handle des Fensters das gerade den Focus hat.

Wenn dein Fenster wieder zerstört wird setzte den Focus auf das Fenster wieder zurück SetFocus(hwndPrev); :)

Malte 2
16.08.2002, 15:04
:(

Ich hab ja schon viel mit SetFocus() experimentiert und die Funktion hat mich bisher immer enttäuscht. Und das hat auch nicht geklappt!

Format C:
16.08.2002, 15:59
bei mir gehts

Malte 2
16.08.2002, 18:52
Ich hab vielleicht mit diesen ganzen Sachen, wann das Fenster aktiviert und deaktiviert werden soll, die Grundfragen etwas unübersichtlich gestaltet. Hier sind die ganz einfachen Fragen:

1) Wie lösche ich den Fokus meines Fensters und geben ihn an ein anderes ab (egal welches, das beste wäre natürlich das vorher aktive)?
2) Wie setzte ich den Fokus meines Fensters, sodass es über den anderen liegt und es aktiviert wird?

Das sind die zwei Fragen, die alle Fragen dieses Themas abdecken.

Ich hab ja schon viele Sachen, wie SetFocus(), SetWindowPos() mit HWND_TOP bzw. HWND_BOTTOM und SetActiveWindow() getestet, alles hat nicht funktioniert.

Malte 2
17.08.2002, 11:12
Schonmal was gelöst. Jetzt wird einfach vor dem Erstellen meines Fensters mit GetActiveWindow() das aktuelle Fenster ermittelt. Dann wird mein Fenster erstellt und ShowWindow() aufgerufen (mit SW_HIDE, das Visible-Flag des Dialogs hab ich wieder entfernt). Danach wird SetActiveWindow() mit dem Rückgabewert von GetActiveWindow() vor dem Erstellen aufgerufen. Und das klappt.

Jetzt muss ich nur noch bei Bedarf den Fokus innerhalb der Nachrichtenschleife abgeben können. Da kann ich nicht einfach GetActiveWindow() aufrufen (den dann liefert das Programm den Handle meines eigenen Fensters).

Malte 2
17.08.2002, 23:48
So, jetzt reicht's! Den zweiten Teil lass ich einfach. Das ist ja auch kein wirklicher Fehler, sondern mehr eine unschöne Eigenschaft. Man wird's merken . . .

Dann ist das Programm jetzt auch fertig. Kann man bald auf Shooter's Site runterladen :) !