⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 kybdhk.dpr

📁 这一系列是我平时收集的pascal深入核心编程
💻 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 + -