Autor Beitrag
Andreas Pfau
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 997



BeitragVerfasst: Fr 05.12.03 21:13 
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:
ausblenden 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:
ausblenden 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:
ausblenden 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():
ausblenden 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!

_________________
Life is a bad adventure, but the graphic is really good!