关于钩子的问题!(100分)

  • 主题发起人 主题发起人 kevin_gao
  • 开始时间 开始时间
K

kevin_gao

Unregistered / Unconfirmed
GUEST, unregistred user!
有一个地方很是不明白。用hook来监视,一个窗口是否出现,怎么实现?用SetWindowsHookEx(WH_GETMESSAGE,@CallBackHook,HInstance,0);之后,好象是只要有消息就截获。我想只处理比如一个窗口出现的消息,应该怎么弄? <br>&nbsp; &nbsp; hook我不是太懂,请高手指点指点。 &nbsp;<br>*****************************************************************************<br>我要实现的是用hook查看比如QQ的弹出窗口,一旦有QQ的窗口弹出,就取得它的句柄,然后去控制它。 该如何用hook找到这个弹出的窗口????????? <br>
 
在回调函数中获取窗口弹出的消息:<br>function CallBackHook(nCode: Integer; wp: wParam; lp: lParam): LResult; stdcall;<br>begin<br>&nbsp; if (( PCWPStruct(lp)^.Message = WM_OPEN) or<br>&nbsp; &nbsp; &nbsp; ( PCWPStruct(lp)^.Message = WM_ACTIVE) or<br>&nbsp; &nbsp; &nbsp; ( PCWPStruct(lP)^.hwnd = 'QQ') then<br>&nbsp; begin<br>&nbsp; &nbsp; .....<br>&nbsp; &nbsp; Exit;<br>&nbsp; end;<br>&nbsp; Result := CallNextHookEx( GoData^.ghHook, nCode, wP, lP);<br>end;<br><br>还有,下次提问请注意换行。
 
有没有详细点的代码例子? 要有详细点的注释.<br><br>谢谢!
 
用findwindow得到QQ窗口的句柄
 
WM_OPEN和WM_ACTIVE这两个消息都说没定义.<br>PCWPStruct(lP)^.hwnd = 'QQ'提示类型不符合.
 
为什么我用钩子钩住之后,一次窗口创建过程回调用很多次回掉函数中过滤后的语句?<br>而且这个语句好象不起作用:sendMessage(temp,WM_SHOWWINDOW,1,0);<br><br>我的回调程序如下:<br>&nbsp;function CallBackHook(nCode: Integer; wp: wParam; lp: lParam): LResult; stdcall;<br>var<br>&nbsp; &nbsp; temp:HWnd;<br>begin<br>&nbsp; if (( PCWPStruct(lp)^.Message = WM_CREATE) and<br>&nbsp; &nbsp; &nbsp; &nbsp; ( PCWPStruct(lP)^.hwnd&lt;&gt;0)) then<br>&nbsp; begin<br>&nbsp; &nbsp; //messagebox(PCWPStruct(lP)^.hwnd,pchar('Test'),pchar('Test'),MB_OKCANCEL) ;<br>&nbsp; &nbsp; temp:=findWindow('#32770','发送消息');<br>&nbsp; &nbsp; if temp&lt;&gt;0 then<br>&nbsp; &nbsp; begin<br>&nbsp; &nbsp; &nbsp; &nbsp; sendMessage(temp,WM_SHOWWINDOW,1,0);<br>&nbsp; &nbsp; &nbsp; &nbsp; MessageDlg('出来了!',mtConfirmation, [mbYes, mbNo], 0);<br>&nbsp; &nbsp; end;<br>&nbsp; &nbsp; &nbsp;Exit;<br>&nbsp; end;<br>Result := CallNextHookEx( HookKeyBoard, nCode, wP, lP);<br>end;<br>
 
sendmessage不行就用postmessage
 
postmessage也不行。为什么?<br><br>还有,一但窗口有创建就会执行7,8次这条语句,为什么?<br>MessageDlg('出来了!',mtConfirmation, [mbYes, mbNo], 0)
 
把你的( PCWPStruct(lP)^.hwnd&lt;&gt;0)) then中的0改为窗口句柄HH,<br>HH := Findwindow(nil,'caption');这样应该不会执行7,8次了。<br>上次说的WM_ACTIVE应该是WM_ACTIVATE...<br>如果要显示窗口,可以不用SendMessage,试试ShowWindow()函数。<br>&nbsp;
 
还是执行7,8回。。。。。。。。。。。。。。。<br><br>:(
 
to :kevin_gao 留下你的QQ号码!!Me: 8046837<br>今天你是怎么发信息到我机子上的!!!!????<br>告诉我,我就帮你编。<br>
 
你的代码有很多问题<br>wm_create只要有窗口创建就会发生<br>qq发送窗口里面也有7,8个子窗口<br>而你的代码只要有wm_create并且发送窗口找到你就弹出messagebox<br>所以会出现你的情况<br>显示窗口一般用showwindow
 
To 热血:<br>&nbsp; &nbsp;这么说出现一次窗口的创建会收到很多次wm_create消息?<br>&nbsp; &nbsp;会不会是我messagebox弹出的时候又出现了wm_create消息?如果这样应该进入死循环<br>吧????????<br><br>
 
可以换一种角度来考虑呀,一个窗口弹出都会获得焦点的,因此可以如此:<br>function HookPro(iCode:Integer;wParam:wParam;lParam:lParam):lResult;stdcall;<br>var <br>&nbsp; hHook:Integer;<br>&nbsp; Cpt:string;<br>begin<br>&nbsp; &nbsp; &nbsp; &nbsp;lHandle:=GetActiveWindow(); &nbsp;//获得活动窗口的句柄<br>&nbsp; &nbsp; &nbsp; &nbsp; SetLength(Cpt,256);<br>&nbsp; &nbsp; &nbsp; &nbsp; GetWindowText(lHandle,pChar(Cpt),256); &nbsp;//获得活动窗口的名字,放入Cpt中<br>&nbsp; &nbsp; &nbsp; &nbsp; SetLength(Cpt,StrLen(pChar(Cpt)));<br>&nbsp; &nbsp; &nbsp; &nbsp; if cpt='QQ 登陆' then<br>&nbsp; &nbsp; &nbsp; &nbsp; begin<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ......//something you do<br>&nbsp; &nbsp; &nbsp; &nbsp; end;<br>end;
 
如果用来关闭调用程序,那么dll(hook)中如何编程?
 
hehe,<br>不要用WH_GETMESSAGE这个钩子,应该用WH_CBT。若wParam=HCBT_CREATEWND,<br>则将要创建一个窗口。<br>看看delphi的帮助巴。<br>it is easy really!!
 
后退
顶部