我想做个当有键盘按下时“隐藏光标”而当鼠标移动时“显示光标”的小Hook。
Dll的代码如下:
library ShowHide;
uses
windows,
messages;{$R *.res}
var
HookCount:integer;
KeyboardHookHWND,MouseHookHWND: HHook; //Hook类型
//********************************************************************
function KeyboardHookHandler(iCode: Integer;wParam: WPARAM;lParam: LPARAM): LRESULT; stdcall;
const
_KeyPressMask = $80000000;
var
ShowNum:Integer;
begin
if (lParam and _KeyPressMask)=0 Then
begin
Result := CallNextHookEx(KeyboardHookHWND, iCode, wParam, lParam);
Exit;
end;
ShowNum:=ShowCursor(false);
while ShowNum>=0 do
ShowNum:=ShowCursor(false);
Result:=CallNextHookEx(KeyboardHookHWND, iCode, wParam, lParam);
end;
//********************************************************************
function MouseHookProc(iCode:Integer;wParam:wParam;lParam:lParam):LRESULT;stdcall;
var
ShowNum:Integer;
begin
if iCode<0 then
begin
Result := CallNextHookEx(MouseHookHWND,iCode,wParam,lParam);
exit;
end;
ShowNum:=showcursor(true);
while ShowNum<0 do
ShowNum:=ShowCursor(true);
result:=CallNextHookEx(MouseHookHWND,iCode,wParam,lParam);
end;
//********************************************************************
function EnableShowHideHook: BOOL;stdcall;export;
begin
Result:=true; // 挂上钩子并保留返回值形成钩子环(Hook Loop)
if HookCount=1 then exit;
if HookCount=0 then
begin
KeyboardHookHWND:=SetWindowsHookEx(WH_KEYBOARD,@KeyboardHookHandler,HInstance,0);
MouseHookHWND:=SetwindowsHookEx(WH_MOUSE,@MouseHookProc,HInstance,0);
if (MouseHookHWND<>0)and(KeyboardHookHWND<>0) then inc(HookCount)
else result:=false;
end;
end;
//***********************************************************************************
function DisableShowHideHook: BOOL;stdcall;export;
begin
result:=false;
if HookCount=0 then exit;
Result := true;
dec(HookCount);
if HookCount = 0 then
begin
UnhookWindowshookEx(KeyboardHookHWND); // 解除键盘钩子
UnHookWindowsHookEx(MouseHookHWND); // 解除鼠标钩子
end;
end;
end;exports
EnableShowHideHook,
DisableShowHideHook;
begin
KeyboardHookHWND:=0;
MouseHookHWND:=0;
HookCount:=0;
end.1.测试时用一个“按钮”调用EnableShowHideHook时可以实现效果!但是用另一个“按钮”调用DisableShowHideHook却不能卸载勾子。只有测试程序退出了勾子才自动卸载,不知道是怎么回事!2.在对文件进行重命名操作时,鼠标指针会一闪一闪的。不知道是怎么回事?在文本文件里进行输入则没有这种现象的。望高手指点!!
Dll的代码如下:
library ShowHide;
uses
windows,
messages;{$R *.res}
var
HookCount:integer;
KeyboardHookHWND,MouseHookHWND: HHook; //Hook类型
//********************************************************************
function KeyboardHookHandler(iCode: Integer;wParam: WPARAM;lParam: LPARAM): LRESULT; stdcall;
const
_KeyPressMask = $80000000;
var
ShowNum:Integer;
begin
if (lParam and _KeyPressMask)=0 Then
begin
Result := CallNextHookEx(KeyboardHookHWND, iCode, wParam, lParam);
Exit;
end;
ShowNum:=ShowCursor(false);
while ShowNum>=0 do
ShowNum:=ShowCursor(false);
Result:=CallNextHookEx(KeyboardHookHWND, iCode, wParam, lParam);
end;
//********************************************************************
function MouseHookProc(iCode:Integer;wParam:wParam;lParam:lParam):LRESULT;stdcall;
var
ShowNum:Integer;
begin
if iCode<0 then
begin
Result := CallNextHookEx(MouseHookHWND,iCode,wParam,lParam);
exit;
end;
ShowNum:=showcursor(true);
while ShowNum<0 do
ShowNum:=ShowCursor(true);
result:=CallNextHookEx(MouseHookHWND,iCode,wParam,lParam);
end;
//********************************************************************
function EnableShowHideHook: BOOL;stdcall;export;
begin
Result:=true; // 挂上钩子并保留返回值形成钩子环(Hook Loop)
if HookCount=1 then exit;
if HookCount=0 then
begin
KeyboardHookHWND:=SetWindowsHookEx(WH_KEYBOARD,@KeyboardHookHandler,HInstance,0);
MouseHookHWND:=SetwindowsHookEx(WH_MOUSE,@MouseHookProc,HInstance,0);
if (MouseHookHWND<>0)and(KeyboardHookHWND<>0) then inc(HookCount)
else result:=false;
end;
end;
//***********************************************************************************
function DisableShowHideHook: BOOL;stdcall;export;
begin
result:=false;
if HookCount=0 then exit;
Result := true;
dec(HookCount);
if HookCount = 0 then
begin
UnhookWindowshookEx(KeyboardHookHWND); // 解除键盘钩子
UnHookWindowsHookEx(MouseHookHWND); // 解除鼠标钩子
end;
end;
end;exports
EnableShowHideHook,
DisableShowHideHook;
begin
KeyboardHookHWND:=0;
MouseHookHWND:=0;
HookCount:=0;
end.1.测试时用一个“按钮”调用EnableShowHideHook时可以实现效果!但是用另一个“按钮”调用DisableShowHideHook却不能卸载勾子。只有测试程序退出了勾子才自动卸载,不知道是怎么回事!2.在对文件进行重命名操作时,鼠标指针会一闪一闪的。不知道是怎么回事?在文本文件里进行输入则没有这种现象的。望高手指点!!
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货