Seite 1 von 2
Systemweiten Shortcut einrichten
Verfasst: 6. Januar 2007 21:56
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
Verfasst: 6. Januar 2007 22:45
von upsala
Versuch es mal über QDesktopWidget.
Verfasst: 7. Januar 2007 02:35
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.
Verfasst: 7. Januar 2007 10:05
von upsala
Als andere Möglichkeit kommt noch QWidget::grabKeyboard() in Betracht, aber damit fängst du alle Tastatureingaben ab.
Verfasst: 7. Januar 2007 13:36
von norbnorb
Wenn ich auf ein Objekt von meiner von QDesktopWidget abgeleiteten Klasse grabKeyboard() ausführe kriegt das keyPressEvent tatsächlich alle Tastatureingaben mit
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.
Verfasst: 8. Januar 2007 01:09
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
Verfasst: 8. Januar 2007 17:47
von upsala
Hier wird es aber zu keiner Lösung kommen, da es mit Qt-Eigenen-Mitteln anscheinend nicht machbar ist.
Verfasst: 8. Januar 2007 17:54
von -=Freaky=-
mist, dann ist das jetzt doppelt traurig
mfg,
julian
Verfasst: 30. Juli 2007 13:27
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.
Verfasst: 17. Februar 2008 16:41
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?
Verfasst: 17. Februar 2008 17:11
von upsala
Meines Wissens gibt es in Qt4.4 diesbezüglich keine Änderungen...
Verfasst: 17. Februar 2008 17:14
von Leffotrak
Okay, danke für die schnelle Antwort.

Verfasst: 15. März 2010 11:13
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?
Verfasst: 15. März 2010 11:52
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
Verfasst: 15. März 2010 15:37
von Exasperation
Sooo... Ich habe beschlossen, einen neuen Windows Hotkey mittels RegisterHotKey zu registrieren.
Dies geschieht über folgende Funktion:
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...