I
iamfly
Unregistered / Unconfirmed
GUEST, unregistred user!
今天在做键盘和鼠标HOOK时发现一件很奇怪的事。具体来说的这样的:<br>我的DLL中在HOOK时先是把键盘和鼠标屏蔽掉(也就是RESULT<>0),然后如果输入了一个正确<br>的密码,就解除屏蔽(令到键盘和鼠标HOOK的函数RESULT=0)。可是。。。怪事发生了:在我<br>测试时,如果此时我的测试程序在ACTIVE状态,我用鼠标点一下任务栏,然后测试程序失去<br>焦点(也就是窗口标题栏不为蓝色了),此时,输入密码不成功(也就是不能解除掉键盘和鼠<br>标的屏蔽),可是如果我用ALT+TAB切换到其它窗口,再输入密码,又成功了(解除了屏蔽)!!!!<br>me //faint 这是为何?后来,我换到在WIN2000下测试,问题依旧。我试了试看用断点来<br>调试,断点设在我输入了密码后的代码处,然后运行,结果是当前ACTIVE窗口不是我用来<br>调用HOOK的窗口时,不会执行到我的断点处的代码。运行我贴上我的代码,大家看看有什么<br>问题没有。谢了:)<br>function keyboardhookhandler(icode:integer;<br> wparam:wparam;lparam:lparam):lresult;stdcall;export;<br>const<br> _keypressmask=$80000000;<br>begin<br> //原来这儿我是直接让result:=1或0的,可是不行,所以只能定义一个<br> //全局BOOL变量kb_input,这样才可以<br> result:=ord(kb_input);<br> if icode<0 then<br> begin<br> result:=callnexthookex(hnexthookproc,icode,wparam,lparam);<br> exit;<br> end;<br> i:=getkeystate(vk_menu);<br> j:=getkeystate(vk_control);<br> if((i and _keypressmask)=_keypressmask)and((j and _keypressmask)=_keypressmask)then<br> begin<br> if(wparam=73)then<br> c_count:=1;<br> if(wparam=65)and(c_count=1)then<br> c_count:=2;<br> if(wparam=77)and(c_count=2)then <br> begin<br>//就是这里的代码,如果当前ACTIVE窗口不是我调用这个鸟HOOK的窗口,并不执行,<br>//可是那句messagedlg的东西还是会显示出来,what happened????<br> kb_input:=false;<br> result:=ord(kb_input);<br> unhookmouse();<br> messagedlg('congratulations,你输入了正确的密码!',mtinformation,[mbok],0);<br> end;<br> end;<br>end;<br><br>function theapr_begin:bool;export;//开始键盘HOOK<br>begin<br> result:=false;<br> if hnexthookproc<>0 then exit;<br> kb_input:=true;<br> hnexthookproc:=setwindowshookex(wh_keyboard,keyboardhookhandler,hinstance,0);<br> hookupmouse();//开始鼠标HOOK<br> result:=hnexthookproc<>0;<br>end;<br><br>function theapr_end:bool;export;//结果键盘HOOK<br>begin<br> if hnexthookproc<>0 then<br> begin<br> unhookwindowshookex(hnexthookproc);<br> unhookmouse();//关闭鼠标HOOK<br> hnexthookproc:=0;<br> messagebeep(0);<br> end;<br> systemparametersinfo(spi_screensaverrunning,0,nil,0);<br> result:=hnexthookproc=0;<br>end;<br><br>