读书人

关于hook使用的有关问题

发布时间: 2012-03-13 11:21:12 作者: rapoo

关于hook使用的问题
各位DX,TX,我想做一个健康键盘输入的程序,想只用钩子。我在创建窗口时候装了一个钩子,代码如下:
KBHook:=SetWindowsHookEx(WH_KEYBOARD,
{callback —>} @KeyboardHookProc,
HInstance,
0) ;

回调函数我是这样写的:
function KeyboardHookProc(Code: Integer; WordParam: Word; LongParam: LongInt) : LongInt;
var
i:Integer;
begin
if(GetKeyState(WordParam) and $8000) = $8000 then
begin
case WordParam of
vk_Space: Form1.Label1.Caption:=Form1.Label1.Caption+IntToStr(0);
vk_Right: Form1.Label1.Left:=Form1.Label1.Left + 5;
vk_Left: Form1.Label1.Left:=Form1.Label1.Left - 5;
vk_Up: Form1.Label1.Top:=form1.Label1.Top - 5;
vk_Down: Form1.Label1.Top:=form1.Label1.Top + 5;
end; {case}
end;

目前的情况是只要焦点在本程序,label1就可以随着键盘的输入移动。但只要焦点切换到其他程序,再按方向键,就会把当前焦点的程序或者窗口结束掉。我把SetWindowsHookEx的HInstance改为0后,不会影响到其他程序,但也捕获不到键盘输入了。
还有,我注入钩子时候,杀毒软件会报。


[解决办法]
兄弟,你安装键盘钩子的方法不对,按照下面安装:
KBHook:=SetWindowsHookEx(WH_KEYBOARD,
{callback —>} @KeyboardHookProc,
0,
GetCurrentThreadId);

这样其他窗口就不会关闭了。
此外你没有再钩子会掉函数中加入:
Result := CallNextHookEx(KBHook, Code, WordParam, LongParam);
改一下你的代码:
if code < 0 then
begin
Result := CallNextHookEx(KBHook, Code, WordParam, LongParam);
Exit;
end;
if(GetKeyState(WordParam) and $8000) = $8000 then
begin
case WordParam of
vk_Space: Form1.Label1.Caption:=Form1.Label1.Caption+IntToStr(0);
vk_Right: Form1.Label1.Left:=Form1.Label1.Left + 5;
vk_Left: Form1.Label1.Left:=Form1.Label1.Left - 5;
vk_Up: Form1.Label1.Top:=form1.Label1.Top - 5;
vk_Down: Form1.Label1.Top:=form1.Label1.Top + 5;
end; {case}
end;
Result := CallNextHookEx(KBHook, Code, WordParam, LongParam);

但是当这个窗体失去焦点后,钩子就不起作用了,如果你想这个窗体失去焦点的时候也是生效,要使用全局钩子,必须把这个钩子放到dll中。

读书人网 >.NET

热点推荐