Hallo,
das habe sicher einige von euch schonmal gebraucht. Man will auf eine Tastenkombination (einen sog. Hotkey) reagieren, aber auch dann, wenn die eigene Anwendung inaktiv ist. Das ließe sich astrein über Hooks realisieren, aber es geht auch wesentlich einfacher.
Windows hat nämlich auch da schon vorgesorgt, mit
RegisterHotkey(). Diese kleine nütliche Funktion "registriert" einen Hotkey, d.h. Windows weiß jetzt, dass es eurer Anwendung eine Nachricht schicken muss, wenn die Tastenkombination gedrückt wird.
Also, zuerstmal muss der Hotkey registerit werden, wofür ich TForm.OnCreate() vorschlage:
Delphi-Quelltext
1: 2: 3: 4:
| procedure TForm1.FormCreate(Sender: TObject); begin RegisterHotKey(Handle, 1, MOD_CONTROL or MOD_SHIFT, Ord('H')); end; |
Parameter:
- Euer Fensterhandle (TForm.Handle)
- Der ID eures Hotkeys. Er muss im Bereich 0..49151 liegen. Ihr könnt ihn selber festlegen. Ausnahme: DLLs. Die müssen sich einen ID von GlobalAddAtom() zuweisen lassen (siehe PSDK).
- Die Modifikationstasten für den Hotkey:
- MOD_ALT: Alt
- MOD_CONTROL: Control (Steuerung)
- MOD_SHIFT: Shift (Umschalttaste)
- MOD_WIN: Windows-Taste
- Die Hotkey-Taste. Ein virtueler Tastencode (siehe PSDK-Onlinehilfe oder MSDN unter "Virtual-Key Codes")
Mein Hotkey ist also [STRG+SHIFT+H], und hat den ID 1. Der ID dient dazu, dass wenn ihr mehrere Hotkeys anmelden wollt, diese auseinanderhalten könnt.
Nun zur Verarbeitung der Hotkeys. Dazu müsst ihr ein Message-Handler aunbauen:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| type TForm1 = class(TForm) procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); private procedure WmHotkey(var Msg: TMessage); message WM_HOTKEY; public end; |
Und hier die Implementierung:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7:
| procedure TForm1.WmHotkey(var Msg: TMessage); begin if (Msg.WParam = 1) then begin end; end; |
So, wann immer jetzt STRG+SHIFT+H gedrückt wird, wird eure Anwendung benachrichtigt - auch wenn sie inaktiv in der Tskbar schlummert.
Und nun zum letzten Part, ihr müsst nämlich den Hotkey freigeben, wenn ihr die Anwendung beendet. Dies gescheiht am besten in TForm.OnDestroy():
Delphi-Quelltext
1: 2: 3: 4:
| procedure TForm1.FormDestroy(Sender: TObject); begin UnregisterHotKey(Handle, HotKeyId); end; |
Fertig! Wenn ihr dazu eine Beispielanendung haben wollt, die gibt's auf meiner HP unter
www.andys-archiv.de.vu/Hotkey.shtml.
Viel Spaß damit!