Seite 1 von 1
Feststellen, ob Programm gerade im Vordergrund/aktiv
Verfasst: 13. September 2008 12:01
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
Verfasst: 15. September 2008 07:59
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 
Verfasst: 15. September 2008 09:03
von upsala
Soetwas geht nicht mit Qt...
Verfasst: 15. September 2008 09:41
von macman
Als Workaround könnte man es mit QApplication::focusWidget() probieren. Kein Widget, nicht aktiv. Weiß aber nicht ob das immer zutrifft.
Verfasst: 15. September 2008 10:17
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.
Verfasst: 15. September 2008 15:55
von FaS
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
Verfasst: 15. September 2008 18:47
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.
Verfasst: 15. September 2008 19:05
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.
Verfasst: 15. September 2008 19:21
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.
Verfasst: 15. September 2008 19:41
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..