Globale Hotkeys in Qt
-
Moin Leute,
für ein Programm benötige ich Handling von globalen Hotkeys, die also auch erkannt werden wenn ein anderes Fenster aktiv ist.
Da ich sowieso auf Windows angewiesen bin bieten die Winapi-Funktionen RegisterHotKey und anschließende Abfrage über GetMessage eine recht einfache Lösung, die ich in einer Konsolenapp auch schon zum Laufen bekommen habe.
Aber wie realisiere ich das ganze unter Qt? Eine Art Mainloop in dem ich GetMessage aufrufen kann habe ich ja nicht. Etwas googlen hat mich auf QWidget.winEvent() gebracht, dessen Reimplementierung scheint hier aber nicht zu funktionieren: Ich bekomme alle möglichen Messages, aber keine WM_HOTKEY.
Hat jemand eine Idee wie ich das abfragen kann, möglichst ohne gethreadete Endlosschleife?
Codefragment (ich benutze PyQt)
def winEvent( self, message ): if message.message == WC.WM_HOTKEY: print "Hotkey!" return True, 0 else: print message return False, 0
-
Hat niemand eine Idee?
Ich konvertiere das ganze mal in C++-Code und präzisiere nochmal, vielleicht kann man mir dann eher helfen:
Habe im Prinzip einfach ein MainWindow das auf Hotkeys reagieren soll, Windows schickt eine WM_HOTKEY Message an den Prozess und ich muss diese abfragen können.
Habe versucht QWidget::winEvent so abzuleitenbool winEvent( MSG *message, long *result ) { *result = 0; if (message.message == WM_HOTKEY) { cout << "Hotkey!" << endl; return true; } return false; }
Ich bekomme auch ne ganze Menge an messages rein, jedoch leider keine WM_HOTKEY, obwohl die Hotkeys vorher korrekt per RegisterHotKey registriert wurden (und auch für andere Programme geblockt sind).
Insbesondere bekomme ich gar keine Events mehr wenn ein anderes Fenster den Fokus hat.Wo liegt der Fehler?
-
Tastatur Eingaben Global abfragen.
Damit hab ich auch mal für ein Programm eine Hotkey Funktion geschrieben.
#include <windows> #include <stdio> #include <iostream> using namespace std; int main() { short key; char szKey[MAX_PATH]; int scan; while(1) { Sleep(10); for(key=0;key<256;key++) { if(GetAsyncKeyState(key)==-32767) { scan=MapVirtualKeyEx(key,0,GetKeyboardLayout(0)); GetKeyNameText(scan << 16,szKey,MAX_PATH); cout << szKey ; // } } } }
-
Is irgendwie im falschen Thread gelanded ... sry
-
Das hilft mir leider nicht viel Mr.Hotkey, da ich besagte Mainloop (siehe Eingangspost) ja in Qt eben nicht habe.
Hab jetzt auch mal versucht das in QCoreApplication::winEventFilter abzufangen, leider ebenfalls erfolglos, es kommen einfach keine WM_HOTKEY durch.