Systemweiten Shortcut einrichten
Systemweiten Shortcut einrichten
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
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
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.
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.
-
- Beiträge: 503
- Registriert: 29. Dezember 2006 22:54
- Wohnort: HL
-
- Beiträge: 503
- Registriert: 29. Dezember 2006 22:54
- Wohnort: HL
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.
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.
-
- Beiträge: 186
- Registriert: 11. März 2009 18:00
- Wohnort: VS
/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?
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.
-
- Beiträge: 503
- Registriert: 29. Dezember 2006 22:54
- Wohnort: HL
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
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
-
- Beiträge: 186
- Registriert: 11. März 2009 18:00
- Wohnort: VS
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:
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...
Dies geschieht über folgende Funktion:
Code: Alles auswählen
RegisterHotKey( this->winId(), 1, 0, VK_SCROLL );
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;
}
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...