1,183
社区成员
发帖
与我相关
我的任务
分享
unit HookUnit;
interface
uses
Windows, Messages, StdCtrls, Classes, Forms;
const
WH_KEYBOARD_LL = 13;//系统级的键盘挂钩程序
type
TShowForm = procedure of object;
PKdDllHookStruct = ^TKdDllHookStruct;
{这个结构包含了一个低级键盘钩子的输入事件,可以捕获键盘输入,具体查看MSDN}
TKdDllHookStruct = record
vkCode: DWORD; //虚拟键码
scanCode: DWORD; //扫描码
flags: DWORD; //标志
time: DWORD;
dwExtraInfo: DWORD; //一些附加信息
end;
var
hNextHookProc: HHook; //保存SetWindowsHookEx的返回值
ShowForm: TShowForm;
function EnableHotKeyHook(AShowForm: TShowForm): BOOL; export; //安装钩子
function DisableHotKeyHook: BOOL; export;
implementation
function LowLevelKeyboardProc(nCode: Integer; WParam: WPARAM; LParam: LPARAM): LRESULT; stdcall;
var
bEatKey: BOOL;
p: PKdDllHookStruct;
dwFlags: DWORD;
begin
Result := 0;
if nCode < 0 then
begin
Result := CallNextHookEx(0, nCode, wParam, lParam);
Exit;
end;
bEatKey := False;
p := PKdDllHookStruct(lParam);
if (nCode = HC_ACTION) and ((WParam = WM_KEYDOWN) or
(WParam = WM_SYSKEYDOWN) or (WParam = WM_KEYUP) or (WParam = WM_SYSKEYUP)) then
begin
if (WParam = WM_KEYDOWN) or (WParam = WM_SYSKEYDOWN) then
dwFlags := 0
else
dwFlags := KEYEVENTF_KEYUP;
if p.vkCode in [VK_RWIN, VK_LWIN] then
begin
keybd_event(VK_CONTROL, 0, dwFlags, 0);
bEatKey := True;
end;
if p.vkCode = VK_F1 then
begin
keybd_event(VK_ESCAPE, 0, dwFlags, 0);
bEatKey := True;
end;
if p.vkCode in [166] then
begin
keybd_event(VK_HOME, 0, dwFlags, 0);
bEatKey := True;
end;
if p.vkCode in [167] then
begin
keybd_event(VK_END, 0, dwFlags, 0);
bEatKey := True;
end;
if p.vkCode in [VK_APPS] then
begin
keybd_event(VK_DELETE, 0, dwFlags, 0);
bEatKey := True;
end;
if p.vkCode in [VK_PAUSE] then
begin
ShowForm;
bEatKey := True;
end;
end;
if bEatKey = True then
Result := 1;
end;
function EnableHotKeyHook(AShowForm: TShowForm): BOOL; export;
begin
ShowForm := AShowForm;
Result := False; //初始化返回值
if hNextHookProc <> 0 then //如果已经注册,直接退出
Exit;
hNextHookProc := SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc, Hinstance, 0);
//注册hook
Result := hNextHookProc <> 0; //通过返回值确定是否注册成功
end;
function DisableHotKeyHook: BOOL; export;
begin
if hNextHookProc <> 0 then
begin
UnhookWindowshookEx(hNextHookProc); //解除Keyboard Hook
hNextHookProc := 0; //恢复标志
end;
Result := hNextHookProc = 0; //返回是否注销成功
end;
end.