Feststellen, ob Programm gerade im Vordergrund/aktiv

Alles rund um die Programmierung mit Qt
Antworten
mehlior
Beiträge: 5
Registriert: 12. September 2008 22:14

Feststellen, ob Programm gerade im Vordergrund/aktiv

Beitrag von mehlior »

Hallo,

ich bin neu mit Qt und stelle wohl hier gerade eine Anfängerfrage, da ich per Suche (auch per Google) nichts passendes gefunden habe.

Ich benutze QSystemTrayIcon um das entsprchende Icon und die Blasen anzeigen zu lassen. Jetzt werden in meinem Programm einige umfangreichere Rechenoperationen vorgenommen, die einige Zeit dauern können. Wenn das Programm nach Abschluss der Rechnung nicht mehr im das aktive ist (also beispielsweise man so lange in einem anderen Programm weiterarbeitet), soll eine entsprechende Blase am Ende der Rechnung angezeigt werden.

Das Blasenanzeigen funktioniert auch ohne Probleme, doch wie bekomme ich heraus, ob mein Programm gerade noch das aktive (also im Vordergrund, oder wie nennt man das) ist?

Vielen Dank für Eure Mühen
Christian
Ginsengelf
Beiträge: 79
Registriert: 2. Mai 2007 10:21

Beitrag von Ginsengelf »

Moin, vielleicht hilft dir QApplication::activeWindow()?
http://doc.trolltech.com/4.3/qapplicati ... tiveWindow

Ginsengelf

edit: noch mal genauer angeguckt, hilft dir wohl doch nicht :roll:
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Soetwas geht nicht mit Qt...
macman
Beiträge: 1738
Registriert: 15. Juni 2005 13:33
Wohnort: Gütersloh
Kontaktdaten:

Beitrag von macman »

Als Workaround könnte man es mit QApplication::focusWidget() probieren. Kein Widget, nicht aktiv. Weiß aber nicht ob das immer zutrifft.
Die deutsche Schriftsprache ist case-sensitive. Außerdem gibt es eine Interpunktionsnorm. Wenn manch einer seine Programme genauso schlampig schreibt, wie sein Posting hier, dann sollte er es lieber bleiben lassen.
mehlior
Beiträge: 5
Registriert: 12. September 2008 22:14

Beitrag von mehlior »

Nein, funktioniert leider auch nicht zuverlässig, da beispielsweise direkt nach dem Start kein Widget den Focus hat.

Zumindest bei Windows klappt es mit der windows.h und

Code: Alles auswählen

unsigned long ForeGroundID = GetWindowThreadProcessId(::GetForegroundWindow(),NULL);
     unsigned long CurrentID   = GetCurrentThreadId();

     if(ForeGroundID==CurrentID)
         ProtokollWrite("1) im Vordergrund");
     else
         ProtokollWrite("1) Nicht im Vordergrund!");
Doch das wäre nicht Betriebssystemunabhängig ... und darum geht es leider auch. Danke für eure bisherigen Mühen und Tipps.
FaS
Beiträge: 184
Registriert: 25. Mai 2006 19:48
Kontaktdaten:

Beitrag von FaS »

Ginsengelf hat geschrieben:Moin, vielleicht hilft dir QApplication::activeWindow()?
http://doc.trolltech.com/4.3/qapplicati ... tiveWindow

Ginsengelf

edit: noch mal genauer angeguckt, hilft dir wohl doch nicht :roll:
Versteh nicht was da nicht gehen soll. Laut Doku passts doch perfekt, und getestet hab ich es auch gerade erfolgreich.
Und dank
doc hat geschrieben:Note that there might be an activeWindow() even if there is no focusWidget() [...]
funktioniert das auch direkt nach dem Start des Programms...

MfG,
FaS
mehlior
Beiträge: 5
Registriert: 12. September 2008 22:14

Beitrag von mehlior »

Auch die ganz einfache Abfrage ala

Code: Alles auswählen

     if(qApp->activeWindow() == NULL)
     {
          QSystemTrayIcon::MessageIcon icon = QSystemTrayIcon::MessageIcon(QSystemTrayIcon::Information);
          trayIcon->showMessage("Trail", text, icon, 15 * 1000);    
     }
führt dazu, dass der Tooltip beim Start des Programms angezeigt wird und wenn ich ein anderes Programm in den Vordergrund setze, wird trotzdem nichts angezeigt. Daher würde ich dies als "funktioniert nicht" einstufen.

Wie hattest Du es eingebaut, dass es funktioniert hat? Kannst mir ja vielleicht Deinen Test zukommen lassen, vielleicht entdecke ich dann den Unterschied.
FaS
Beiträge: 184
Registriert: 25. Mai 2006 19:48
Kontaktdaten:

Beitrag von FaS »

Du schreibst nichts darüber wann und wo die Funktion aufgerufen wird, woher soll ich wissen was genau nicht funktioniert. Die Funktion ist übrigens statisch, sollte man über QApplication::activeWindow() aufrufen, aber das würde hier nichts ändern, und deine eine Zeile sieht komisch aus, schreibst du auch "int integer = int(4)"? ;-)

Also ich habe testeshalber alle halbe Sekunden activeWindow() ausgeben lassen, und immer wenn eine andere Anwendung im Vordergrund war, war das Ergebnis 0.
mehlior
Beiträge: 5
Registriert: 12. September 2008 22:14

Beitrag von mehlior »

Das ganze wird immer dann aufgrufen, wenn eine Nachricht zum Ausgeben da ist. Diese Nachricht soll in ein Protokoll-Textfeld (da kommt es immer an) reingeschrieben werden und wenn das Programm gerade nicht im Vordergrung ist, eben zusätzlich als diese "Blase" erscheinen.
FaS
Beiträge: 184
Registriert: 25. Mai 2006 19:48
Kontaktdaten:

Beitrag von FaS »

Entweder hast du ein Fehler im Programm und die Funktion wird überhauptgarnicht aufgerufen, oder etwas stimmt mit dem trayIcon nicht... hast du mal testeshalber genau vor der if()-Abfrage QApplication::activeWindow() ausgeben lassen, und geschaut ob überhaupt etwas ausgegeben wird wenn die Sprechblase angezeigt werden soll? Dann siehst du auch gleich welches Fenster (angeblich) den Fokus hat, und kannst schauen warum dies so ist..
Antworten