Canvas not supported
Canvas not supported
Suchen
Bookmark
Canvas not supported
Shine Effekt
Direkt zum Seiteninhalt

Hauptmenü:

Globale Hotkeys registrieren

 

Autor:

Oscar Kohler

Version:

0.11

Level:

Einfach

Sprache:

C/C++


 
Haftungsausschluss / Disclaimer
Kontakt / Contact
Drucken / Print


Tastenkombinationen in Programmen beschleunigen die Arbeit oft enorm. Anstatt um einen Text in die Zwischenablage zu kopieren erst umständlich im Kontextmenu den "Kopieren" Eintrag zu suchen und auszuwählen, genügt ein einfaches Tastenkürzel: Ctrl-C.

Shortcuts ...


Viele Programme verfügen über eine stattliche Anzahl an Tastenkombinationen, die das umständliche navigieren in den Menüs fast schon überflüssig machen ... sofern man die Kombinationen kennt.
Technisch werden diese Tastaturkombinationen meist mittels "Key
Accelerators" realisiert und diese haben einen kleinen Nachteil ... die Kombinationen funktionieren nur dann, wenn das betreffende Programm aktiviert wurde, also das Fenster den Fokus hat.
Der Grund ist einfach der, dass Windows Tastatur - und Maus - Nachrichten immer an das aktive Fenster schickt.

Wollen wir Tastatur Kombinationen jedoch an Programme schicken die nicht aktiv sind, oder sogar gar kein Fenster haben, scheitern wir mit dieser Technik kläglich ...

  • Steuerung eines Medien Players der im Hintergrund arbeitet,

  • Bildschirmfotos mit einer Tasten Kombination schiessen,

  • u.s.w. ...


Hotkeys implementieren ...


Wir benötigen also eine Möglichkeit die uns erlaubt, mit bestimmten Tastenkombinationen Programme im Hintergrund ansprechen zu können ...

Und  genau für diesen Zweck, hat uns Microsoft einen Mechanismus beschert: Globale Hotkeys

Windows Messages


Wieder "verfolgt" uns das Thema: Windows Nachrichten, denn der Mechanismus wurde mittels Messages realisiert.

Tutorial: Window Messages


Theoretisch funktioniert der Vorgang recht einfach ...


  • Tastatur Kombination registrieren,
  • Warten bis uns Windows das Ereignis mitteilt,

  • Gewünschte Aktion ausführen,

  • Tastatur Kombination wieder de-registrieren


Praktisch ist es auch nicht viel komplizierter ...


Zuerst mal müssen wir Windows mitteilen, mit welcher Tastaturkombination wir in welchem Fenster, welche Funktion ausführen wollen ...

Dies erledigen wir mit der RegisterHotKey() Api Funktion

BOOL WINAPI RegisterHotKey(
 _In_opt_  HWND hWnd,
 _In_      int id,
 _In_      UINT fsModifiers,
 _In_      UINT vk
);

[MSDN]

MSDN: RegisterHotKey()


HWnd ... gibt das betreffende Fenster an. Geben wir NULL mit, so sendet Windows die Nachrichten an unsere eigene Thread-Message-Queue,
id ... ist die ID des Hotkey. Dadurch können wir für ein Programm mehrere Hotkeys registrieren und diese auch unterscheiden,
fsModifiers ... bestimmt die Modifier, die zusätzlich zur eigentlichen Taste gedrückt werden müssen ... z.B.: Ctrl, Alt, ...
vk ... Code der virtuelle Hotkey Taste

Das Tolle ist nun, dass uns Windows die Freiheit lässt sowohl ein Fenster, als auch die eigene Thread-Message-Queue auszuwählen.
Dadurch funktioniert diese Methode auch mit einem Console Fenster und sogar mit Programmen die gar kein Fenster haben !

Simples Beispiel


Für das Beispiel habe ich ein extrem simples Windows Programm gewählt, das über kein eigenes Fenster verfügt. Dies veranschaulicht auch am besten, dass die Hotkey Methode wirklich "im Hintergrund" arbeitet.
Das Ziel ist, dass beim Drücken der Tastenkombination ein Ton ausgegeben wird.

if (! RegisterHotKey ( NULL, 1, MOD_ALT | MOD_CONTROL, VK_F1 )) {
  
// Fehler !
}

Der Hotkey wird ohne Fenster, mit der ID:1 und der Tastatur-Kombination ALT+CTRL+F1 registriert.
Diese Kombination darf natürlich nicht bereits von einem anderen Programm belegt sein.

Im nächsten Schritt betreten wir die Message-Loop und warten, bis uns Windows eine WM_HOTKEY Nachricht mit der richtigen ID schickt.
Da wir unsere Thread-Message-Queue bei der Registrierung angegeben haben, reicht eine Messageloop und wir benötigen keine WndProc.

MSG msg;

while (
GetMessage( &msg, NULL, 0, 0 ) != 0 ) {
  if ( msg.message ==
WM_HOTKEY ) {
     switch ( msg.wParam ) {
        
case 1:
           
MessageBeep( MB_ICONWARNING );
           break;
        ...
     }
  }
}

Mit GetMessage() lesen wir solange die Queue aus, bis eine WM_QUIT Nachricht vorliegt, die das Programm beendet.
Danach sehen wir nach, ob eine WM_HOTKEY Nachricht abgegeben wurde und im wParam wird uns die Hotkey-ID mitgegeben.
Stimmt die ID überein, lassen wir Windows ordentlich biepen !

Beenden können wir die Nachrichtenschleife mit einer PostQuitMessage(returncode), die einfach eine WM_QUIT Nachricht an unsere eigene Message Queue schickt.

Schlussendlich de-registrieren wir sauber unsere Hotkey Kombination:

UnregisterHotKey( NULL, 1 );

MSDN: UnregisterHotKey()


Hier findet sich eine Auflistung der Virtual Key Codes:

MSDN: Vitual Keys


Im Prinzip Source-Code Beispiel werden zwei Hotkeys registriert:

  • F1 ... gibt einen Warning Sound aus, entsprechend dem eingestellten Sound-Schema,

  • F2 ... gibt einen Error Sound aus und beendet anschliessend das Programm.


Da das Programm über kein eigenes Fenster verfügt, kann man es auf dem Desktop auch nicht sehen. Im Task-Manager ist es natürlich sichtbar !



SourceCode


 
Kein Kommentar
 
Letzte Änderung: 03.02.2015
button Canvas not supported button
Zurück zum Seiteninhalt | Zurück zum Hauptmenü