private
procedure KeyMessage(const Msg: TMsg);
end;
var
Form1: TForm1;
implementation
uses Windows;
{$R *.lfm}
var
GHook: HHOOK;
function MessageHookProc(nCode: Integer; wParam: WPARAM;
lParam: LPARAM): LRESULT; stdcall;
var
Msg: LCLType.PMsg absolute lParam;
begin
if nCode >= 0 then
case Msg^.message of
WM_KEYDOWN, WM_KEYUP, WM_SYSKEYDOWN, WM_SYSKEYUP, WM_CHAR, WM_SYSCHAR:
Form1.KeyMessage(Msg^);
end;
Result := CallNextHookEx(GHook, nCode, wParam, lParam);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
GHook := SetWindowsHookEx(WH_GETMESSAGE, @MessageHookProc, 0, MainThreadID);
if GHook = 0 then
RaiseLastOSError;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
if GHook <> 0 then
begin
UnhookWindowsHookEx(GHook);
GHook := 0;
end;
end;
procedure TForm1.KeyMessage(const Msg: LCLType.TMsg);
begin
case Msg.message of
WM_KEYDOWN:
Memo1.Append('WM_KEYDOWN: ' + IntToStr(Msg.wParam));
WM_KEYUP:
Memo1.Append('WM_KEYUP: ' + IntToStr(Msg.wParam));
WM_SYSKEYDOWN:
Memo1.Append('WM_SYSKEYDOWN: ' + IntToStr(Msg.wParam));
WM_SYSKEYUP:
Memo1.Append('WM_SYSKEYUP: ' + IntToStr(Msg.wParam));
WM_CHAR:
Memo1.Append('WM_CHAR: ' + IntToStr(Msg.wParam) + ' "' + Chr(Msg.wParam) + '"');
WM_SYSCHAR:
Memo1.Append('WM_SYSCHAR: ' + IntToStr(Msg.wParam) + ' "' + Chr(Msg.wParam) + '"');
end;
end;