Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

01.06.2012, 19:01

Fokusproblem von einem Fenster?

Guten Abend zusammen!

Ich habe eine Frage, die ich als Fokusproblem definieren würde ...

Und zwar:
Ich habe ein Erinnerungsprogramm geschrieben, dass in einem bestimmten Zeitabstand ein "Popup - Fenster" erzeugt.
Jetzt stehe ich vor dem Problem (Das Programm läuft in einer Endlosschleife), dass dieses "Popup" meine anderen Anwendungen minimiert, wenn diese im Vollbildmodus sind (z.B. bei Spielen).
Daher wollte ich fragen, ob es eine Möglichkeit gibt, dem Programm den Fokus zu "entziehen", so dass andere Programme nicht mehr minimiert werden? Oder noch besser, so dass es nicht Minimiert wird, aber dennoch am Bildschirm sichtbar ist (Eben als Meldung die übergeblendet wird)?

Ich habe folgende Versuche gehabt:
- Mein erster Versuch lief in einer Konsolen - Anwendung (wobei die Konsole mit FreeConsole freigegeben wurde), und erzeugt eine MessageBox, die dann die Erinnerung beinhalltet. (C++)
Da hierbei die anderen Programme minimiert werden, habe ich folgendes Probiert:
- Ich habe eine Windows Form erstellt (C++/CLI) und habe dort ein Fenster gemacht, was mein Popup ersetzten soll.
Und dann über die Variable this->Visible = true, bzw this->Visible = false das Fenster sichtbar und unsichtbar gemacht

Jedoch ist auch mein letzter Versuch gescheitert. Auch mit dem selbst erstelltem "Popup" wird alles andere minimiert, sobald ich das Fenster sichtbar mache :(

Hoffe ihr könnt mir helfen,
Mit freundlichen Grüßen,
Ombalat

2

07.06.2012, 22:24

So, ich hab das Problem, das ich hatte jetzt gelöst ... Hier meine Lösung, falls mal jemand das selbe Problem haben sollte:
Ich bin bei einem C++/CLI Projekt geblieben und hab damit mein eigenes "Popup" gemacht.
Über this->Visible schallte ich das Fenster ein und aus.
Mit Hilfe der Funktion GetForegroundWindow() hole ich mir das Fenster, das gerade offen ist (Bevor das Popup sichtbar gemacht wurde!)
Nach einer überprüfung, ob das Fenster NICHT der Dektop ist, hol ich mir vom Dektop und von dem aktuell offenem Fenster mit Hilfe der Funktion GetWindowRect die beiden Größen des Fensters.
Mit denen habe ich dann einfach überprüft, ob die beiden Fenster (Also das aktuell offene und das vom Dektop) gleich groß sind und man sich dadurch im Vollbildmodus befunden hat.
Mit SetForegroundWindow kann man, wenn dieser Fall eintritt, das vorherige Fenster wieder in den Vordergund bringen und dadurch das Minimieren im Vollbildmodus verhindern

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
HWND hwndActive = GetForegroundWindow(); //Das HWND zum aktuell offenen Fenster holen

this->Visible = true; //Erinnerungs Fenster sichtbar machen

//Überprüfen, ob das aktuell geöffnete Fenster nicht der Desktop oder ein Shell Fenster ist
if(hwndActive != GetDesktopWindow() && hwndActive != GetShellWindow()) 
{
    RECT rcActive;
    RECT rcDesc;
    GetWindowRect(GetDesktopWindow(), &rcDesc); //Fenster Daten des Desktops abfragen
    GetWindowRect(hwndActive, &rcActive); //Fenster Daten desaktuell offenem Fensters abfragen
            
    //Überprüfe, ob das aktuell geöffnete Fenster mit dem Desktop Fenster übereinstimmt (==> Follbildmodus)
    if(rcActive.right == rcDesc.right &&
       rcActive.bottom == rcDesc.bottom)
                SetForegroundWindow(hwndActive); //Gibt das aktuelle Fenster wieder in den Fordergrund (Follbildmodus)
}