新手初学HOOK的几个疑问~ 很急~ 路过的大哥帮忙!高分相送!刘麻子大侠过来看看! ( 积分: 150 )

  • 主题发起人 主题发起人 coolfishs
  • 开始时间 开始时间
C

coolfishs

Unregistered / Unconfirmed
GUEST, unregistred user!
给位大哥好~ &nbsp;小弟是新手,初学delphi没多久~ 最近在研究HOOK,有几点想问问大家~<br>以下是一个最常见例子,大家都看得懂,最下面是我提的问题,希望大家尽力回答,授人以鱼,不如授人以渔!<br>function KbHook(iCode: Integer; wParam: WPARAM; lParam: LPARAM):LRESULT;StdCall;Export;<br>begin<br> &nbsp;if iCode &lt; 0 then<br> &nbsp;begin<br> &nbsp; &nbsp;Result := CallNextHookEx(KeybHook, iCode, wParam, lParam);<br> &nbsp; &nbsp;Exit;<br> &nbsp;end;<br> &nbsp;以下略。。。。。<br>end;<br><br>1:我在全文搜索里找了很多有关这方面的资料和例子为什么很多HOOK例子的开头格式都是这样子的呢?<br>如:function KbHook(iCode: Integer; wParam: WPARAM; lParam: LPARAM):LRESULT;StdCall;Export;<br>是不是所有和HOOK有关的,开头的格式都必须是这样子写?为什么?<br><br>2:if iCode &lt; 0 then 这个判断语句到底起到什么作用?为什么很多HOOK例子,开头都有这个判断?<br><br>3:Result := CallNextHookEx(KeybHook, iCode, wParam, lParam); 返回怎么结果呢?<br>CallNextHookEx函数具体是怎么用的?该函数起到怎么作用?<br><br>拜托各位大哥不要叫我去查MSDN,帮助。我E文很烂!再说家里比较穷,一直买不起昂贵的书!<br>谢谢你们帮助我~~~~~~~~`` &nbsp;跪谢~ &nbsp;我真的很想学!授人以鱼,不如授人以渔!
 
给位大哥好~ &nbsp;小弟是新手,初学delphi没多久~ 最近在研究HOOK,有几点想问问大家~<br>以下是一个最常见例子,大家都看得懂,最下面是我提的问题,希望大家尽力回答,授人以鱼,不如授人以渔!<br>function KbHook(iCode: Integer; wParam: WPARAM; lParam: LPARAM):LRESULT;StdCall;Export;<br>begin<br> &nbsp;if iCode &lt; 0 then<br> &nbsp;begin<br> &nbsp; &nbsp;Result := CallNextHookEx(KeybHook, iCode, wParam, lParam);<br> &nbsp; &nbsp;Exit;<br> &nbsp;end;<br> &nbsp;以下略。。。。。<br>end;<br><br>1:我在全文搜索里找了很多有关这方面的资料和例子为什么很多HOOK例子的开头格式都是这样子的呢?<br>如:function KbHook(iCode: Integer; wParam: WPARAM; lParam: LPARAM):LRESULT;StdCall;Export;<br>是不是所有和HOOK有关的,开头的格式都必须是这样子写?为什么?<br><br>2:if iCode &lt; 0 then 这个判断语句到底起到什么作用?为什么很多HOOK例子,开头都有这个判断?<br><br>3:Result := CallNextHookEx(KeybHook, iCode, wParam, lParam); 返回怎么结果呢?<br>CallNextHookEx函数具体是怎么用的?该函数起到怎么作用?<br><br>拜托各位大哥不要叫我去查MSDN,帮助。我E文很烂!再说家里比较穷,一直买不起昂贵的书!<br>谢谢你们帮助我~~~~~~~~`` &nbsp;跪谢~ &nbsp;我真的很想学!授人以鱼,不如授人以渔!
 
google: delphi hook 啊 ...
 
拜托LSUPER大哥~ 像你这样还不如不要回答的好!
 
1. 这里KbHook是钩子回调函数, 必须按照系统规定的格式来写, 也即一种'约定' ..<br><br>2. 不同类型的钩子的回调, iCode的含义不同, 一般表示是否可以处理,但是这仅是文档的说法<br><br>3. CallNextHookEx()是调用钩子链上的下一个钩子回调函数, 并且返回该钩子函数返回值<br><br>要睡觉了,就打这么多,如果有问题再讲吧,顺便说一句,其实这些在帮助上都有的. :-)
 
谢谢~ &nbsp;麻子大侠!<br> &nbsp;就知道你是最热心的~ &nbsp;哈哈! <br> &nbsp;还有那为大哥~ 有什么更好的见解呢?
 
1.Export多余<br>2.我从来不这样写[:D]<br>if iCode = HC_ACTION then<br>begin<br> &nbsp;...<br>end;<br>Result := CallNextHookEx(KeybHook, iCode, wParam, lParam); <br>3.刘麻子大侠已讲过了
 
看看Delphi源代码ComCtrls<br>function ToolMenuKeyMsgHook(Code: Integer; WParam: Longint; var Msg: TMsg): Longint; stdcall;<br>begin<br> &nbsp;if (Code = HC_ACTION) then<br> &nbsp;begin<br> &nbsp; &nbsp;if Msg.Message = CM_DEACTIVATE then<br> &nbsp; &nbsp; &nbsp;MenuToolBar2.CancelMenu<br> &nbsp; &nbsp;else if Msg.message = WM_COMMAND then<br> &nbsp; &nbsp; &nbsp;ReleaseToolMenuKeyHooks<br> &nbsp; &nbsp;else if (ToolMenuHook = 0) and ((Msg.Message = WM_CHAR) or<br> &nbsp; &nbsp; &nbsp;(Msg.Message = WM_KEYDOWN) or (Msg.Message = WM_KEYUP) or<br> &nbsp; &nbsp; &nbsp;(Msg.Message = WM_SYSKEYDOWN) or (Msg.Message = WM_SYSKEYUP)) then<br> &nbsp; &nbsp; &nbsp;Msg.hwnd := MenuToolBar2.Handle;<br> &nbsp;end;<br> &nbsp;Result := CallNextHookEx(ToolMenuKeyHook, Code, WParam, Longint(@Msg))<br>end;
 
http://www.delphifans.com<br>上面有一本《Delphi 下深入Windows 核心编程》的电子版<br>对钩子讲的比较详细,去下载吧,免费的
 
英文水平差没关系,很复杂的英文文章可以看不懂,但是对于MSDN中基本的API说明等,如果还看不懂,那就有些麻烦了
 
function KbHook(iCode: Integer; wParam: WPARAM; lParam: LPARAM):LRESULT;StdCall;Export;<br>begin<br> &nbsp;if iCode &lt; 0 then<br> &nbsp;begin<br> &nbsp; &nbsp;Result := CallNextHookEx(KeybHook, iCode, wParam, lParam);<br> &nbsp; &nbsp;Exit;<br> &nbsp;end;<br> &nbsp;以下略。。。。。<br>end;<br><br>1:我在全文搜索里找了很多有关这方面的资料和例子为什么很多HOOK例子的开头格式都是这样子的呢?<br>如:function KbHook(iCode: Integer; wParam: WPARAM; lParam: LPARAM):LRESULT;StdCall;Export;<br>是不是所有和HOOK有关的,开头的格式都必须是这样子写?为什么?<br>======<br>这个函数是一个回调函数(就是由windows来调用的函数),既然windows要调用你的代码,那么windows肯定要传参数给你了,所以这个函数的参数个数,类型和参数传递方式由windows决定的,这里参数为3个,类型都为integer类型,参数传递方式为STDCALL(右至左顺序压栈,退栈由函数自身完成).至于取什么名字就不管了。<br>2:if iCode &lt; 0 then 这个判断语句到底起到什么作用?为什么很多HOOK例子,开头都有这个判断?<br>============================<br>iCode&lt;0表示不用处理的动作。<br>3:Result := CallNextHookEx(KeybHook, iCode, wParam, lParam); 返回怎么结果呢?<br>CallNextHookEx函数具体是怎么用的?该函数起到怎么作用?<br>============================<br>钩子是采用类似后进先出的链表数据结构,就是说最后注册的钩子一定会第一个被调用到。<br>而CallNextHookEx作用就是调用后面钩子的处理例程,并且处理例程的返回值会由CallNextHookEx函数返回。比如有一个钩子比你的钩子还晚注册,那么它将处于你的钩子函数前面,它对于不处理的钩子,(如果)它调用了CallNextHookEx函数的话,CallNextHookEx函数就会调用你的函数KbHook,你处理后的结果(就是KbHook函数的返回)将返回给CallNextHookEx,同样,你不处理的可以交给下一个钩子函数,而它的返回值你可以直接作为你的函数的返回值,这样你也成了一个二传手了。当然,对于你处理过的,你就可以不传递下去了,并返回一个1,告诉系统,这个事件已经被处理了。<br>这样说应该够详细了吧?
 
多人接受答案了。
 
coolfishs, 你给Radboy的Demo是否可以给我一份? &nbsp;Liu_mazi@126.com
 
后退
顶部