📄 kybdhk.dpr
字号:
library KybdHk;
uses Windows, Messages;
type
// 共享内存结构
PShareMem = ^TShareMem;
TShareMem = record
g_hhook: HHOOK; // 全局键盘钩子句柄
g_hwndPost: HWND; // 通知消息接收窗体
g_uMsgNotify: UINT; // 键盘事件通知消息
g_hwndEdit: HWND; // 屏蔽列表编辑控件
end;
const
// 内存映射文件名
SHARE_NAME = 'KeyboardHook_Shared';
var
// 内存映射文件句柄
FileMap: THandle;
// 内存映射文件地址
PShared: PShareMem;
// 键盘钩子回调函数
function KeyboardHook_HookProc(nCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
var
ac: array[0..1] of Char;
bKeyState: TKeyboardState;
uScanCodeAndShiftState: UINT;
sz: array[0..256] of Char;
begin
// 交给下一个钩子处理
Result := CallNextHookEx(PShared.g_hhook, nCode, wParam, lParam);
// 消息被移出消息队列
if (nCode = HC_ACTION) then
begin
uScanCodeAndShiftState := HIWORD(lParam) and ($FF or KF_UP);
// 投递键盘事件通知消息
PostMessage(PShared.g_hwndPost, PShared.g_uMsgNotify, wParam, lParam);
// 按键转换成对应的字符
GetKeyboardState(bKeyState);
if (ToAscii(wParam, uScanCodeAndShiftState, bKeyState, ac, 0) = 1) then
begin
// 取屏蔽列表(编辑框)
SendMessage(PShared.g_hwndEdit, WM_GETTEXT, SizeOf(sz), Integer(@sz[0]));
// 是否存在于屏蔽列表
if Pos(ac[0], sz) > 0 then Result := 1;
end;
end;
end;
// 安装钩子
function KeyboardHook_Start(hwndPost: HWND; uMsgNotify: UINT; hwndEdit: HWND): BOOL; stdcall;
var
hhook: LongWord; // HHOOK
begin
// 已经安装
if (PShared.g_hhook <> 0) then
begin
Result := FALSE;
Exit;
end;
// 更新参数
PShared.g_hwndPost := hwndPost;
PShared.g_uMsgNotify := uMsgNotify;
PShared.g_hwndEdit := hwndEdit;
// 使下面语句不易被打断
Sleep(0);
// 安装钩子
hhook := SetWindowsHookEx(WH_KEYBOARD, @KeyboardHook_HookProc, HInstance, 0);
// 保证同步
InterlockedExchange(Integer(PShared.g_hhook), Integer(hhook));
// 是否成功
Result := PShared.g_hhook <> 0;
end;
// 卸载钩子
function KeyboardHook_Stop(): BOOL; stdcall;
begin
// 已经安装
if (PShared.g_hhook <> 0) then
begin
Result := UnhookWindowsHookEx(PShared.g_hhook);
PShared.g_hhook := 0;
end else
Result := TRUE;
end;
// DLL回调
procedure DLLMain(dwReason: DWORD);
begin
if (dwReason = DLL_PROCESS_DETACH) then
begin
UnmapViewOfFile(PShared);
CloseHandle(FileMap);
end;
end;
// 导出函数
exports
KeyboardHook_Start,
KeyboardHook_Stop;
// DLL入口 (进入每个进程空间时执行)
begin
// 设置回调
DllProc := @DLLMain;
// 尝试打开
FileMap := OpenFileMapping(FILE_MAP_ALL_ACCESS, FALSE, SHARE_NAME);
// 还未建立
if (FileMap = 0) then
begin
FileMap :=
CreateFileMapping(DWORD(-1), nil, PAGE_READWRITE, 0, SizeOf(TShareMem), SHARE_NAME);
PShared := MapViewOfFile(FileMap, FILE_MAP_ALL_ACCESS, 0, 0, 0);
ZeroMemory(PShared, SizeOf(TShareMem));
end else
PShared := MapViewOfFile(FileMap, FILE_MAP_ALL_ACCESS, 0, 0, 0);
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -