//******************************************************************************
//* Datei: GlobalHotKey.Pas
//* Klasse: TGlobalHotKey
//* Autors: xxx ( DP: Sunlight7 )
//* Christopher Henschel ( DP: Relicted )
//* Zweck: Komponente zum setzen Globaler Hotkeys für eine
//* Anwendung
//*
//* --------------------------------------------------------------------------
//* $Date: May 29 2007 10:16:36 $
//* $Modtime: $
//* $Revision: 1.0 $
//* $Workfile: GlobalHotKey.pas $
//******************************************************************************
unit GlobalHotKey;
interface
uses
Classes,
Controls,
Messages,
Windows;
// Speicherrecord für die einzelnen Hotkeys.
type
THotKey =
record
HotKeyVK : cardinal;
HotKeyModifiers : cardinal;
HotKeyID : integer;
end;
// Event für das Formular
type
TGlobalHotKeyPressed =
procedure( fsModifiers, vk : Cardinal )
of object;
// Klasse zum Handlen der HotKey-Events
type
TGlobalHotKey =
class(TComponent)
private
// Counter für die HotKeyIDs
nHotKeyID : integer;
// Speicherarray für die HotKeys
arHotKeys :
array of THotKey;
// Member für das OnHotKeyPressed Event
m_pmnfHotKeyPressed : TGlobalHotKeyPressed;
// Handle
FWindowHandle : HWND;
// Funktion zum setzen des OnHotKeyPressed Events.
procedure SetHotKeyPressed(
const Event : TGlobalHotKeyPressed );
protected
procedure WMHotKey(
var Message:TMessage);
message WM_HOTKEY;
public
// Funktion zum setzen eines neuen globalen Hotkeys.
// vk: Virtueller Key, auf welchen reagiert werden soll.
// z.B. : "VK_F9" für die F9 Taste.
// fsModifiers:
// MOD_ALT ALT muß gedrückt sein
// MOD_CONTROL CTRL muß gedrückt sein
// MOD_SHIFT SHIFT muß gedrückt sein
// MOD_WIN WINDOWS-Taste muß gedrückt sein
// Mehrere Modifiers werden mit "or" verknüpft.
function RegisterGlobalHKey( fsModifiers, vk : Cardinal ) : boolean;
// Destructor und Constructor...
destructor Destroy;
override;
constructor Create(AOwner: TComponent);
override;
// Property für das Handle
property Handle : HWND
read FWindowHandle;
published
// Property zum setzen des OnHotKeyPressed-Events
property OnHotKeyPressed : TGlobalHotKeyPressed
read m_pmnfHotKeyPressed
write SetHotKeyPressed;
end;
// Prozedur zum registrieren der Komponente.
procedure Register;
implementation
//******************************************************************************
//* Behandelt die Registrierung der Komponente in der Reiterkarte "Zusätzlich"
//******************************************************************************
procedure Register;
begin
RegisterComponents('
Zusätzlich', [TGlobalHotKey]);
end;
//******************************************************************************
//* Behandelt die Registrierung eines Hotkeys
//******************************************************************************
function TGlobalHotKey.RegisterGlobalHKey(fsModifiers, vk : Cardinal) : boolean;
var
bSet : boolean;
begin
result := false;
try
// Hotkey registrieren
bSet := RegisterHotKey( Self.Handle, nHotKeyID, fsModifiers, vk );
if bSet
then
begin
// Speicherplatz für einen neuen Hotkey erweitern
SetLength( arHotKeys, Length(arHotKeys)+1 );
// Hotkey Eintrag
with arHotKeys[ Length(arHotKeys)-1 ]
do
begin
HotKeyVK := vk;
HotKeyModifiers := fsModifiers;
HotKeyID := nHotKeyID;
end;
// Result Setzen
result := true;
// Die HotKeyId hochzählen...
Inc(nHotKeyID);
end;
except
//...
end;
end;
//******************************************************************************
//* Behandelt das Event, welches ausgelöst wird wenn einer der Hotkeys gedrückt
//* wurde und sendet dieses, falls vorhanden an das Formular weiter
//******************************************************************************
procedure TGlobalHotKey.WMHotKey(
var Message:TMessage);
begin
try
if Assigned( m_pmnfHotKeyPressed )
and (
Message.Msg = WM_HotKey )
then
m_pmnfHotKeyPressed(
Message.LParamLo,
Message.LParamHi );
Message.Result := DefWindowProc(FWindowHandle,
Message.Msg,
Message.wParam,
Message.lParam);
except
//...
end;
end;
//******************************************************************************
//* Constructor
//******************************************************************************
constructor TGlobalHotKey.Create(AOwner: TComponent);
begin
inherited;
// Initialisieren
nHotKeyID := 1;
FWindowHandle := AllocateHWND(WMHotKey);
end;
//******************************************************************************
//* Destructor
//******************************************************************************
destructor TGlobalHotKey.Destroy;
var
i : integer;
begin
// Hotkeys wieder unregistrieren
for i := 0
to Length( arHotKeys ) - 1
do
UnRegisterHotKey(Self.Handle, arHotKeys[ i ].HotKeyID);
DeallocateHWnd(FWindowHandle);
inherited;
end;
//******************************************************************************
//* Behandlung der Set Methode für das HotKeyEvent
//******************************************************************************
procedure TGlobalHotKey.SetHotKeyPressed(
const Event: TGlobalHotKeyPressed);
begin
m_pmnfHotKeyPressed := Event;
end;
end.