关于HOOK的一个很怪的问题?HOOK会不起作用???(300分)

  • 主题发起人 主题发起人 iamfly
  • 开始时间 开始时间
I

iamfly

Unregistered / Unconfirmed
GUEST, unregistred user!
今天在做键盘和鼠标HOOK时发现一件很奇怪的事。具体来说的这样的:<br>我的DLL中在HOOK时先是把键盘和鼠标屏蔽掉(也就是RESULT&lt;&gt;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>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;wparam:wparam;lparam:lparam):lresult;stdcall;export;<br>const<br>&nbsp; _keypressmask=$80000000;<br>begin<br>&nbsp; //原来这儿我是直接让result:=1或0的,可是不行,所以只能定义一个<br>&nbsp; //全局BOOL变量kb_input,这样才可以<br>&nbsp; result:=ord(kb_input);<br>&nbsp; if icode&lt;0 then<br>&nbsp; begin<br>&nbsp; &nbsp; &nbsp;result:=callnexthookex(hnexthookproc,icode,wparam,lparam);<br>&nbsp; &nbsp; &nbsp;exit;<br>&nbsp; end;<br>&nbsp; i:=getkeystate(vk_menu);<br>&nbsp; j:=getkeystate(vk_control);<br>&nbsp; if((i and _keypressmask)=_keypressmask)and((j and _keypressmask)=_keypressmask)then<br>&nbsp; begin<br>&nbsp; &nbsp; if(wparam=73)then<br>&nbsp; &nbsp; &nbsp; c_count:=1;<br>&nbsp; &nbsp; if(wparam=65)and(c_count=1)then<br>&nbsp; &nbsp; &nbsp; c_count:=2;<br>&nbsp; &nbsp; if(wparam=77)and(c_count=2)then &nbsp; <br>&nbsp; &nbsp; begin<br>//就是这里的代码,如果当前ACTIVE窗口不是我调用这个鸟HOOK的窗口,并不执行,<br>//可是那句messagedlg的东西还是会显示出来,what happened????<br>&nbsp; &nbsp; &nbsp; kb_input:=false;<br>&nbsp; &nbsp; &nbsp; result:=ord(kb_input);<br>&nbsp; &nbsp; &nbsp; unhookmouse();<br>&nbsp; &nbsp; &nbsp; messagedlg('congratulations,你输入了正确的密码:)!',mtinformation,[mbok],0);<br>&nbsp; &nbsp; end;<br>&nbsp; end;<br>end;<br><br>function theapr_begin:bool;export;//开始键盘HOOK<br>begin<br>&nbsp; result:=false;<br>&nbsp; if hnexthookproc&lt;&gt;0 then exit;<br>&nbsp; kb_input:=true;<br>&nbsp; hnexthookproc:=setwindowshookex(wh_keyboard,keyboardhookhandler,hinstance,0);<br>&nbsp; hookupmouse();//开始鼠标HOOK<br>&nbsp; result:=hnexthookproc&lt;&gt;0;<br>end;<br><br>function theapr_end:bool;export;//结果键盘HOOK<br>begin<br>&nbsp; if hnexthookproc&lt;&gt;0 then<br>&nbsp; begin<br>&nbsp; &nbsp; &nbsp;unhookwindowshookex(hnexthookproc);<br>&nbsp; &nbsp; &nbsp;unhookmouse();//关闭鼠标HOOK<br>&nbsp; &nbsp; &nbsp;hnexthookproc:=0;<br>&nbsp; &nbsp; &nbsp;messagebeep(0);<br>&nbsp; end;<br>&nbsp; systemparametersinfo(spi_screensaverrunning,0,nil,0);<br>&nbsp; result:=hnexthookproc=0;<br>end;<br><br>
 
怎么没人答的?不是我这个问题太难了吧,还是没人愿答我?我记得大富翁不是这样子的,<br>难道我一个月没来就变了?
 
天哪,还没人答,版主,看来我要把这个问题暂时挂在这,等我找到答案再贴上来,让大家<br>都了解多一点如何:)
 
我认为这可能是DLL的数据共享问题,对于使用HOOK的DLL来说,系统会把他插入<br>每个应用程序的地址空间。对于应用程序来说方法是共享的但变量却时私有的,<br>不管是局部变量还是全局变量。也就是说你的kb_input在一个active程序中改变了,<br>并不会影响其余的程序
 
GlobalAddAtom(Pchar('KBHook_ID');<br>GlobalFindAtom(Pchar('KBHook_ID');<br>可以用这两个函数设置全局标志。<br>
 
SORRY,最近刚到新单位工作,没时间上网。mywyn说的我需要点时间来消化,SOUL兄说的我<br>要试试,不过也是要有空时,唉,现在在医院里太忙了
 
我没有认真地看,不过,我了认为应该是DLL变量的共享问题,因为你用钩子的时候,是以<br>DLL形式出现,那么每个已经加载到内存中的进程就会把你的DLL的地址"映射"到其进程空间<br>去,所以每个DLL中的变量值是"独立"的:),因为你必须把判断的变量设为"全局":)这样<br>问题就好自然解决了:)
 
这段时间都在找我的这个DLL的源代码,换了个硬盘,很多东东都不知放在哪了:(<br>要慢慢找。不过,就目前看来,应该是全局共享的问题:)<br>等找到了,试试,希望能解决:)<br>谢谢大家,先分分吧(保持的时间太长了)^_^
 
后退
顶部