unit hotkey; {************************************************* * TGlHotKey - Delphi Component for registering * * Global Keyboard HotKeys * * -------------------------------------------- * * Properties: * * Modifiers - Hotkey Modifiers * * Set this property to MOD_ALT, MOD_SHIFT, * * MOD_CTRL, MOD_WIN. You can only set this * * property if hotkey is deactivated. * * VKCode - Virtual Key Code * * Set this property to Virtual Key Code of * * keyboard button that will trigger the * * Hotkey. You can only set this property * * if hotkey is deactivated. * * Events: * * OnHotKey * * This event is triggered when user * * activates hotkey. * * Methods: * * Activate - Activate chosen Hotkey * * Deactivate - Deactivate chosen Hotkey * * * * * * Created by Filip Milivojevic * * filip@fissoft.cjb.net * * * *************************************************} interface uses classes,windows,messages; type TGlHotkeyModifiers=set of (modShift, modCtrl, modAlt, modWin); TGlHotkey=class(TComponent) private fModifiers:TGlHotkeyModifiers; fVKCode:integer; fActive:boolean; fHandle:integer; fOnHotkey:TNotifyEvent; procedure wndProc(var msg:TMessage); procedure setModifiers(value:TGlHotkeyModifiers); procedure setVKCode(value:integer); public constructor Create(AOwner:TComponent);override; destructor Destroy;override; procedure Activate; procedure DeActivate; published property Modifiers:TGlHotkeyModifiers read fModifiers write setModifiers; property VKCode:integer read fVKCode write setVKCode; property OnHotkey:TNotifyEvent read fonHotkey write fonHotkey; end; procedure Register; implementation procedure Register; begin RegisterComponents('Samples',[TGlHotkey]); end; procedure TGlHotkey.wndProc(var msg:TMessage); begin if msg.Msg=WM_HOTKEY then if assigned(fOnHotkey) then fOnHotkey(self); end; procedure TGlHotkey.setModifiers(value:TGlHotkeyModifiers); begin if not fActive then fModifiers:=value; end; procedure TGlHotkey.setVKCode(value:integer); begin if not fActive then fVKCode:=value; end; constructor TGlHotkey.Create(AOwner:TComponent); begin inherited Create(AOwner); fHandle:=AllocateHWnd(wndProc); end; destructor TGlHotkey.Destroy; begin DeallocateHWnd(fHandle); inherited Destroy; end; procedure TGlHotkey.Activate; var fmod:integer; begin if fActive then exit; fActive:=true; fmod:=0; if modShift in fModifiers then fmod:=fmod+MOD_SHIFT; if modCtrl in fModifiers then fmod:=fmod+MOD_CONTROL; if modAlt in fModifiers then fmod:=fmod+MOD_ALT; if modWin in fModifiers then fmod:=fmod+MOD_WIN; RegisterHotKey(fhandle,1,fMod,fVKCode); end; procedure TGlHotkey.DeActivate; begin if not fActive then exit; fActive:=false; UnRegisterHotKey(fhandle,1); end; end.