Entwickler-Ecke

Windows API - ...einen Hotkey global verarbeiten?


Andreas Pfau - Fr 05.12.03 21:13
Titel: ...einen Hotkey global verarbeiten?
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() [http://msdn.microsoft.com/library/en-us/winui/winui/windowsuserinterface/userinput/keyboardinput/keyboardinputreference/keyboardinputfunctions/registerhotkey.asp]. 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:
  1. Euer Fensterhandle (TForm.Handle)
  2. 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).
  3. Die Modifikationstasten für den Hotkey:
    • MOD_ALT: Alt
    • MOD_CONTROL: Control (Steuerung)
    • MOD_SHIFT: Shift (Umschalttaste)
    • MOD_WIN: Windows-Taste
  4. 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
    { Private-Deklarationen }
    procedure WmHotkey(var Msg: TMessage); message WM_HOTKEY;
  public
    { Public-Deklarationen }
  end;

Und hier die Implementierung:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
procedure TForm1.WmHotkey(var Msg: TMessage);
begin
  if (Msg.WParam = 1then
  begin
    // Hier auszuführenden Code einfügen
  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 http://www.andys-archiv.de.vu/Hotkey.shtml.

Viel Spaß damit!