Systemweiten Shortcut einrichten

Alles rund um die Programmierung mit Qt
norbnorb
Beiträge: 6
Registriert: 6. Januar 2007 21:27

Systemweiten Shortcut einrichten

Beitrag von norbnorb »

Hi

ich möchte mit einem QT Programm auf Tastaturshortcuts reagieren,
auch wenn mein Programm nicht den Fokus hat.

Dazu hab ich ein paar Fragen

1. Ich hab versucht, mit QApplication::keyboardModifiers() in einer Schleife den Status der Tasten auszuwerten.
QApplication::keyboardModifiers() liefert aber nur Informationen über einige Steuertasten und nicht über "normale" Tasten wie die Taste "A".

Gibt es in QT so etwas wie die GetKeyState WinApi Funktion, die den Status aller Tasten abfragen kann? (sollte natürlich plattformübergreifend sein)

2. Kann man vlt ein QShortcut Objekt erstellen, das systemweit Shortcuts abfängt? (mit dem gesamten Desktop als parent oder so)

3. Geht es irgendwie anders?

mfg
norbnorb
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Versuch es mal über QDesktopWidget.
norbnorb
Beiträge: 6
Registriert: 6. Januar 2007 21:27

Beitrag von norbnorb »

Hab jetzt mal eine Klasse erstellt, die von QDesktopWidget abgeleitet ist und die keyPressEvent Methode überschreibt. In der Methode kommt aber nix an...

Anscheinend kann die QDesktopWidget Klasse keine Tastatureingaben verarbeiten, also wohl auch keine Shortcuts.
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Als andere Möglichkeit kommt noch QWidget::grabKeyboard() in Betracht, aber damit fängst du alle Tastatureingaben ab.
norbnorb
Beiträge: 6
Registriert: 6. Januar 2007 21:27

Beitrag von norbnorb »

Wenn ich auf ein Objekt von meiner von QDesktopWidget abgeleiteten Klasse grabKeyboard() ausführe kriegt das keyPressEvent tatsächlich alle Tastatureingaben mit :D

Die Tastatureingaben gehen dabei aber blöderweise verloren, d.h. ich kann in keiner Anwendung mehr was tippen.

Wenn auf das übergebene QKeyEvent Objekt ignore(); angewendet wird, bringt das irgendwie auch nix.
-=Freaky=-
Beiträge: 503
Registriert: 29. Dezember 2006 22:54
Wohnort: HL

Beitrag von -=Freaky=- »

ich würde dasselbe gern wissen (wie erstelle ich systemweite hotkeys ?), ist also doppelt wichtig, dass man hier zu ner lösung kommt !

mfg,
julian
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Hier wird es aber zu keiner Lösung kommen, da es mit Qt-Eigenen-Mitteln anscheinend nicht machbar ist.
-=Freaky=-
Beiträge: 503
Registriert: 29. Dezember 2006 22:54
Wohnort: HL

Beitrag von -=Freaky=- »

mist, dann ist das jetzt doppelt traurig :(

mfg,
julian
norbnorb
Beiträge: 6
Registriert: 6. Januar 2007 21:27

Beitrag von norbnorb »

ist inzwischen schon etwas her, aber mit dem GlobalShortcutManager unter
http://dev.psi-im.org/websvn/listing.ph ... alshortcut_
und dem GlobalAccelManager unter
http://svn.netlabs.org/qtapps/browser/p ... ccel?rev=9
geht es.

Ein Problem hab ich nur: Die Manager kriegen erst dann events mit, wenn ich einmal die Maus ueber das Programmfenster bewegt hab. Vorher wird die Methode
bool eventFilter(QObject* o, QEvent* e)
nicht aufgerufen.
Leffotrak
Beiträge: 26
Registriert: 12. Mai 2007 10:44

Beitrag von Leffotrak »

Da mich das Thema auch interessiert, schiebe ich es noch mal nach oben. Hat schon wer eine richtige Lösung gefunden oder verspricht die kommende Qt 4.4-Version Abhilfe?
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Meines Wissens gibt es in Qt4.4 diesbezüglich keine Änderungen...
Leffotrak
Beiträge: 26
Registriert: 12. Mai 2007 10:44

Beitrag von Leffotrak »

Okay, danke für die schnelle Antwort. :)
Exasperation
Beiträge: 186
Registriert: 11. März 2009 18:00
Wohnort: VS

Beitrag von Exasperation »

/push


Gibt es da wirklich keine Möglichkeit? Vllt via QDesktop? Ich schreibe gerade just-for-fun ne kleine App um Screenshots zu machen... Die soll dann natürlich nicht im Vordergrund laufen.. Und wenn ich eine Taste bspw. während eines Films/Spiels was auch immer drücke, soll das bei meiner App ankommen... Gibt es da eine Möglichkeit?
Zuletzt geändert von Exasperation am 15. März 2010 13:15, insgesamt 1-mal geändert.
-=Freaky=-
Beiträge: 503
Registriert: 29. Dezember 2006 22:54
Wohnort: HL

Beitrag von -=Freaky=- »

ich wuesste da immer noch keine moeglichkeit, das via Qt zu machen.
du koenntest
1. Qxt benutzen (http://doc.libqxt.org/tip/qxtglobalshortcut.html)
2. auf jeder plattform selbst die tastendruecke abfangen (keyboard hooks, etc.)

mfg,
julian
Exasperation
Beiträge: 186
Registriert: 11. März 2009 18:00
Wohnort: VS

Beitrag von Exasperation »

Sooo... Ich habe beschlossen, einen neuen Windows Hotkey mittels RegisterHotKey zu registrieren.

Dies geschieht über folgende Funktion:

Code: Alles auswählen

RegisterHotKey( this->winId(), 1, 0, VK_SCROLL );
Dann überschreib ich das winEvent meines main_windows:

Code: Alles auswählen

bool main_window::winEvent( MSG *message, long *result )
{
	*result = 0;
	if( message->message == WM_HOTKEY )
	{
		on_take_screenshot();
		return true;
	}

	return false;
}
Und siehe da: Auch wenn mein Programm auf die Taskleiste minimiert ist, werden bei Druck auf ScrollLock bzw Rollen bzw. welche Taste man auch immer definiert, meine Screenshots erstellt!

Zwei Fragen hätte ich noch: Wie kann ich unterscheiden welcher registrierte Hotkey gedrückt wurde, wenn ich mehrere registriere? Hat da jemand nen Hinweis für mich..?

Und ich habe jetzt mal mit einem Video getestet ob ich da auch Screenshots machen kann... da erhalte ich allerdings nur schwarze Bilder :/ Weiß jemand wie ich auch dort ein ordentliches Bild bekomme? Schließlich möchte ich damit auch beim Zocken Screenshots machen können...
Antworten