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

📄 unitdll.pas

📁 在delphi中实现windows核心编程.原书光盘代码核心编程.原书光盘代码
💻 PAS
字号:
unit UnitDll;

interface

uses Windows;

const BUFFER_SIZE = 16 * 1024;
const HOOK_MEM_FILENAME = 'MEM_FILE';
const HOOK_MUTEX_NAME = 'MUTEX_NAME';
type
  TShared = record
    Keys: array[0..BUFFER_SIZE] of Char;
    KeyCount: Integer;
  end;
  PShared = ^TShared;
var
  MemFile, HookMutex: THandle;
  hOldKeyHook: HHook;
  Shared: PShared;

implementation

function KeyHookProc(iCode: Integer; wParam: WPARAM;
  lParam: LPARAM): LRESULT; stdcall; export;
const
  KeyPressMask = $80000000;
begin
  if iCode < 0 then
    Result := CallNextHookEx(hOldKeyHook,
      iCode,
      wParam,
      lParam)
  else begin
    if ((lParam and KeyPressMask) = 0) then
    begin
      Shared^.Keys[Shared^.KeyCount] := Char(wParam and $00FF);
      Inc(Shared^.KeyCount);
      if Shared^.KeyCount >= BUFFER_SIZE - 1 then Shared^.KeyCount := 0;
    end;
    result:=0;
  end;
end;


function EnableKeyHook: BOOL; export;

begin
  Shared^.KeyCount := 0;
  if hOldKeyHook = 0 then
  begin
    hOldKeyHook := SetWindowsHookEx(WH_KEYBOARD,
      KeyHookProc,
      HInstance,
      0);
  end;
  Result := (hOldKeyHook <> 0);
end;

{撤消钩子过滤函数}
function DisableKeyHook: BOOL; export;
begin
  if hOldKeyHook <> 0 then
  begin
    UnHookWindowsHookEx(hOldKeyHook);
    hOldKeyHook := 0;
    Shared^.KeyCount := 0;
  end;
  Result := (hOldKeyHook = 0);
end;



function GetKeyCount: Integer; export;
begin
  Result := Shared^.KeyCount;
end;


function GetKey(index: Integer): Char; export;
begin
  Result := Shared^.Keys[index];
end;



procedure ClearKeyString; export;
begin
  Shared^.KeyCount := 0;
end;

exports
  EnableKeyHook,
  DisableKeyHook,
  GetKeyCount,
  ClearKeyString,
  GetKey;

initialization
        HookMutex := CreateMutex(nil,
          True,
          HOOK_MUTEX_NAME);
        MemFile := OpenFileMapping(FILE_MAP_WRITE,
          False,
          HOOK_MEM_FILENAME);
        if MemFile = 0 then
          MemFile := CreateFileMapping($FFFFFFFF,
            nil,
            PAGE_READWRITE,
            0,
            SizeOf(TShared),
            HOOK_MEM_FILENAME);
        Shared := MapViewOfFile(MemFile,
          File_MAP_WRITE,
          0,
          0,
          0);
        ReleaseMutex(HookMutex);
        CloseHandle(HookMutex);
finalization
        if hOldKeyHook <> 0 then DisableKeyHook;
        UnMapViewOfFile(Shared);
        CloseHandle(MemFile);
end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -