library Project2; 
uses 
  SysUtils, 
  Classes, 
  uHookKeyAndMouse in 'uHookKeyAndMouse.pas'; {$R *.res} begin 
StartHookKeyMouse; 
end. 
unit uHookKeyAndMouse; 
interface uses 
Windows,Messages,SysUtils; const 
WH_KEYBOARD_LL =13; 
WH_MOUSE_LL =14; 
type 
  tagKBDLLHOOKSTRUCT = packed record 
    vkCode: DWORD; 
    scanCode: DWORD; 
    flags: DWORD; 
    time: DWORD; 
    dwExtraInfo: DWORD; 
  end; 
  KBDLLHOOKSTRUCT = tagKBDLLHOOKSTRUCT; 
  PKBDLLHOOKSTRUCT = ^KBDLLHOOKSTRUCT; 
  
type 
PMSLLHOOKSTRUCT=^MSLLHOOKSTRUCT; 
MSLLHOOKSTRUCT = record 
pt:TPoint; 
mouseData:DWORD; 
flags:DWORD; 
time:DWORD; 
dwExtraInfo:DWORD; 
end; procedure StartHookKeyMouse; 
procedure StopHookKeyMouse; implementation var 
hhkLowLevelKybd:HHook=0; 
hhkLowLevelMouse:HHook=0; Procedure WriteTxt(sFileName,sText:String); //写txt文件 
Var 
F:TextFile; 
Begin 
AssignFile(F,sFileName); 
IF FileExists(sFileName) Then 
Append(F) 
Else 
ReWrite(F); 
WriteLn(F,sText); 
CloseFile(F); 
End; function LowLevelKeyboardProc(nCode:Integer; WParam:WPARAM; LParam:LPARAM):LRESULT; stdcall; 
var 
  p: PKBDLLHOOKSTRUCT; 
begin 
Result:=0; 
p := PKBDLLHOOKSTRUCT(lParam); 
if (WParam=256) or (WParam=257) then // and  (p.vkCode=13) then 
begin 
if p.vkCode=13 then 
begin 
WriteTxt('c:\0.txt',inttostr(p.vkCode)); 
end; 
end; 
Result:=0; 
if nCode <>0 then Result:=CallNextHookEx(0,nCode,WParam,LParam); 
end; function LowLevelMouseProc(nCode:Integer; WParam:WPARAM; LParam:LPARAM):LRESULT; stdcall; 
var 
p:PMSLLHOOKSTRUCT; 
begin 
Result:=0; 
p:=PMSLLHOOKSTRUCT(LParam); 
if (WParam=513) or (WParam=514) then 
begin 
if (p.pt.X>300) and (p.pt.X <500) and (p.pt.y>100) and (p.pt.y <600) then 
begin 
WriteTxt('c:\0.txt',inttostr(WParam)+'////////////'+inttostr(p.pt.X)+'/'+inttostr(p.pt.y)); 
end; 
end; 
Result:=0; 
if nCode <>0 then Result:=CallNextHookEx(0,nCode,WParam,LParam); 
end; procedure StartHookKeyMouse; 
begin 
if hhkLowLevelKybd = 0 then 
begin 
hhkLowLevelKybd := SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc, Hinstance, 0); 
end; 
if hhkLowLevelMouse = 0 then 
begin 
hhkLowLevelMouse:=SetWindowsHookEx(WH_MOUSE_LL,LowlevelMouseProc,HInstance,0); 
end; 
WriteTxt('c:\0.txt','钩子安装成功!id:'+inttostr(hhkLowLevelKybd)+'/'+inttostr(hhkLowLevelMouse)); 
end; procedure StopHookKeyMouse; 
begin 
if hhkLowLevelKybd <> 0 then 
begin 
UnhookWindowsHookEx(hhkLowLevelKybd); 
hhkLowLevelKybd:=0; 
end; 
if hhkLowLevelMouse <> 0 then 
begin 
UnHookWindowsHookEx(hhkLowLevelMouse); 
hhkLowLevelMouse:=0; 
end; 
end; initialization 
hhkLowLevelKybd:=0; 
hhkLowLevelMouse:=0; 
finalization 
if hhkLowLevelKybd <> 0 then UnhookWindowsHookEx(hhkLowLevelKybd); 
if hhkLowLevelMouse <> 0 then UnhookWindowsHookEx(hhkLowLevelMouse); 
end. 
就像发神经一样,有时候系统加载正常,有时候不行, 记录不正常的 
钩子安装成功!id:7536755/2097329 
就这样没了. 
正常的 
钩子安装成功!id:3539541/6095331 
13 
13 
表示回车. 为什么会这样呢?得到了钩子ID就说明成功安装了啊,怎么会不行呢? 
DLL是通过explorer来启动的,可以看到已经加载进去了,钩子也钩上了,但是,为什么有时候可以有时候不行 
难道和系统有关系吗?