中国hoc安全小组吧 关注:2贴子:164
  • 10回复贴,共1

WindowsHOOK技术(整合版)

只看楼主收藏回复

Hook这个东西有时令人又爱又怕,Hook是用来拦截系统某些讯息之用,例如说,我们想
让系统不管在什麽地方只要按个Ctl-B便执行NotePad,或许您会使用Form的KeyPreview
,设定为True,但在其他Process中按Ctl-B呢?那就没有用,这是就得设一个Keyboard
Hook来拦截所有Key in的键;再如:MouseMove的Event只在该Form或Control上有效,如镇
果希望在Form的外面也能得知Mouse Move的讯息,那只好使用Mouse Hook来栏截Mouse
的讯息。再如:您想记录方才使用者的所有键盘动作或Mosue动作,以便录巨集,那就
使用JournalRecordHook,如果想停止所有Mosue键盘的动作,而放(执行)巨集,那就
使用JournalPlayBack Hook;Hook呢,可以是整个系统为范围(Remote Hook),即其他
Process的动作您也可以拦截,也可以是LocalHook,它的拦截范围只有Process本身。
Remote Hook的Hook Function要在.Dll之中,Local Hook则在.Bas中。
在VB如何设定Hook呢?使用SetWindowsHookEx()
Declare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" _
         (ByVal idHook As Long, _
          ByVal lpfn As Long,     _
          ByVal hmod As Long,     _
          ByVal dwThreadId As Long) As Long
idHook代表是何种Hook,有以下几种
      Public Const WH_CALLWNDPROC = 4
      Public Const WH_CALLWNDPROCRET = 12
      Public Const WH_CBT = 5
      Public Const WH_DEBUG = 9
      Public Const WH_FOREGROUNDIDLE = 11
      Public Const WH_GETMESSAGE = 3
      Public Const WH_HARDWARE = 8
      Public Const WH_JOURNALPLAYBACK = 1
      Public Const WH_JOURNALRECORD = 0
      Public Const WH_KEYBOARD = 2
      Public Const WH_MOUSE = 7
      Public Const WH_MSGFILTER = (-1)
      Public Const WH_SHELL = 10
      Public Const WH_SYSMSGFILTER = 6
lpfn代表Hook Function所在的Address,这是一个CallBack Fucnction,当挂上某个
      Hook时,我们便得定义一个Function来当作某个讯息产生时,来处理它的Function
      ,这个Hook Function有一定的叁数格式
      Private Function HookFunc(ByVal nCode As Long, _
                               ByVal wParam As Long, _
                               ByVal lParam As Long ) As Long
          nCode 代表是什麽请况之下所产生的Hook,随Hook的不同而有不同组的可能值



IP属地:中国香港1楼2010-06-20 17:11回复
              wParam lParam 传回值则随Hook的种类和nCode的值之不同而不同。
          因这个叁数是一个 Function的Address所以我们固定将Hook Function放在.Bas中,
          并以AddressOf HookFunc传入。至於Hook Function的名称我们可以任意给定,不一
          定叫 HookFunc
    hmod 代表.DLL的hInstance,如果是Local Hook,该值可以是Null(VB中可传0进去),
          而如果是Remote Hook,则可以使用GetModuleHandle(".dll名称")来传入。
    dwThreadId 代表执行这个Hook的ThreadId,如果不设定是那个Thread来做,则传0(所以
          一般来说,Remote Hook传0进去),而VB的Local Hook一般可传App.ThreadId进去
    值回值 如果SetWindowsHookEx()成功,它会传回一个值,代表目前的Hook的Handle,
          这个值要记录下来。
    因为A程式可以有一个System Hook(Remote Hook),如KeyBoard Hook,而B程式也来设一
    个Remote的KeyBoard Hook,那麽到底KeyBoard的讯息谁所拦截?答案是,最后的那一个
    所拦截,也就是说A先做keyboard Hook,而后B才做,那讯息被B拦截,那A呢?就看B的
    Hook Function如何做。如果B想让A的Hook Function也得这个讯息,那B就得呼叫
    CallNextHookEx()将这讯息Pass给A,於是产生Hook的一个连线。如果B中不想Pass这讯息
    给A,那就不要呼叫CallNextHookEx()。
    Declare Function CallNextHookEx Lib "user32" Alias "CallNextHookEx" _
              (ByVal hHook As Long, _
               ByVal ncode As Long, _
               ByVal wParam As Long, _
               lParam As Any) As Long
    hHook值是SetWindowsHookEx()的传回值,nCode, wParam, lParam则是Hook Procedure
    中的三个叁数。
    最后是将这Hook去除掉,请呼叫UnHookWindowHookEx()
    Declare Function UnhookWindowsHookEx Lib "user32" Alias "UnhookWindowsHookEx"    _
              (ByVal hHook As Long) As Long
    hHook便是SetWindowsHookEx()的传回值。此时,以上例来说,B程式结束Hook,则换A可
    以直接拦截讯息。
    KeyBoard Hook的范例
    Hook Function的三个叁数
    nCode           wParam                       lParam            传回值
    ===========     ========================== ==============    ================
    HC_ACTION       表按键Virtual Key            与WM_KEYDOWN同    若讯息要被处理传0
    或                                                         反之传1
    


    IP属地:中国香港2楼2010-06-20 17:11
    回复
      WH_JOURNALRECORD Hook
      WH_JOURNALRECORD Hook使应用程序可以监视输入事件。典型地,应用程序使用该HOOK记录鼠标、键盘输入事件以供以后回放。该HOOK是全局HOOK,并且不能在指定线程中使用。
      WH_JOURNALPLAYBACK Hook
      ` WH_JOURNALPLAYBACK Hook使应用程序可以向系统消息队列中插入消息。该HOOK可以回放以前由WH_JOURNALRECORD HOOK录制的鼠标、键盘输入事件。在WH_JOURNALPLAYBACK Hook安装到系统时,鼠标、键盘输入事件将被屏蔽。该HOOK同样是一个全局HOOK,不能在指定线程中使用。
      WH_JOURNALPLAYBACK Hook返回一个时间暂停值,它告诉系统,在处理当前回放的消息时,系统等待百分之几秒。这使得此HOOK可以控制在回放时的时间事件。
      WH_KEYBOARD Hook
      WH_KEYBOARD Hook使应用程序可以监视由GetMessage和PeekMessage返回的WM_KEYDOWN 及WM_KEYUP消息。应用程序使用该HOOK监视发送到消息队列中的键盘输入。
      WH_MOUSE Hook
      WH_MOUSE Hook 使应用程序可以监视由GetMessage和PeekMessage返回的消息。应用程序使用该HOOK监视发送到消息队列中的鼠标输入。
      WH_MSGFILTER and WH_SYSMSGFILTER Hooks
      WH_MSGFILTER 和WH_SYSMSGFILTER Hooks使应用程序可以监视菜单、滚动条、消息框、对话框,当用户使用ALT+TAB或ALT+ESC来切换窗体时,该HOOK也可以拦截到消息。WH_MSGFILTER仅在应用程序内部监视菜单、滚动条、消息框、对话框,而WH_SYSMSGFILTER则可以在系统内监视所有应用程序的这些事件。
      WH_SHELL Hook
      一个SHELL程序可以使用WH_SHELL Hook来接收重要的信息。当一个SHELL程序被激活前或当前窗体被创建、消毁时,系统会调用WH_SHELL Hook过程。
      使用HOOK
      安装、消毁HOOK过程
      监视系统事件
      安装、消毁HOOK过程
      使用SetWindowsHookEx函数,指定一个HOOK类型,自己的HOOK过程是全局还是局部HOOK,同时给出HOOK过程的进入点,就可以轻松的安装你自己的HOOK过程。
      Declare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" _
                    (ByVal idHook As Long, _
                      ByVal lpfn As Long,          _
                      ByVal hmod As Long,          _
                      ByVal dwThreadId As Long) As Long
      idHook代表是何种Hook,有以下几种
                  Public Const WH_CALLWNDPROC = 4
                  Public Const WH_CALLWNDPROCRET = 12
                  Public Const WH_CBT = 5
                  Public Const WH_DEBUG = 9
                  Public Const WH_FOREGROUNDIDLE = 11
                  Public Const WH_GETMESSAGE = 3
                  Public Const WH_HARDWARE = 8
                  Public Const WH_JOURNALPLAYBACK = 1
      


      IP属地:中国香港5楼2010-06-20 17:11
      回复
                    Public Const WH_JOURNALRECORD = 0
                    Public Const WH_KEYBOARD = 2
                    Public Const WH_MOUSE = 7
                    Public Const WH_MSGFILTER = (-1)
                    Public Const WH_SHELL = 10
                    Public Const WH_SYSMSGFILTER = 6
        lpfn代表Hook Function所在的Address,这是一个CallBack Fucnction,当挂上某个Hook时,我们便得定义一个Function来当作某个讯息产生时,来处理它的Function,这个Hook Function有一定的叁数格式
                    Private Function HookFunc(ByVal nCode As Long, _
                                            ByVal wParam As Long, _
                                            ByVal lParam As Long ) As Long
                        nCode 代表是什麽请况之下所产生的Hook,随Hook的不同而有不同组的可能值。
                        wParam lParam 传回值则随Hook的种类和nCode的值之不同而不同。
                    因这个叁数是一个 Function的Address所以我们固定将Hook Function放在.Bas中,并以AddressOf HookFunc传入。至於Hook Function的名称我们可以任意给定,不一定叫 HookFunc
        hmod 代表.DLL的hInstance,如果是Local Hook,该值可以是Null(VB中可传0进去),而如果是Remote Hook,则可以使用GetModuleHandle(".dll名称")来传入。
        dwThreadId 代表执行这个Hook的ThreadId,如果不设定是那个Thread来做,则传0(所以一般来说,Remote Hook传0进去),而VB的Local Hook一般可传App.ThreadId进去。
        值回值 如果SetWindowsHookEx()成功,它会传回一个值,代表目前的Hook的Handle,这个值要记录下来。
        因为A程式可以有一个System Hook(Remote Hook),如KeyBoard Hook,而B程式也来设一个Remote的KeyBoard Hook,那麽到底KeyBoard的讯息谁所拦截?答案是,最后的那一个所拦截,也就是说A先做keyboard Hook,而后B才做,那讯息被B拦截,那A呢?就看B的Hook Function如何做。如果B想让A的Hook Function也得这个讯息,那B就得呼叫CallNextHookEx()将这讯息Pass给A,於是产生Hook的一个连线。如果B中不想Pass这讯息给A,那就不要呼叫CallNextHookEx()。
        Declare Function CallNextHookEx Lib "user32" Alias "CallNextHookEx" _
                        (ByVal hHook As Long, _
                        ByVal ncode As Long, _
        


        IP属地:中国香港6楼2010-06-20 17:11
        回复
                          ByVal wParam As Long, _
                          lParam As Any) As Long
          hHook值是SetWindowsHookEx()的传回值,nCode, wParam, lParam则是Hook Procedure中的三个叁数。
          最后是将这Hook去除掉,请呼叫UnHookWindowHookEx()
          Declare Function UnhookWindowsHookEx Lib "user32" Alias "UnhookWindowsHookEx"          _
                          (ByVal hHook As Long) As Long
          hHook便是SetWindowsHookEx()的传回值。此时,以上例来说,B程式结束Hook,则换A可以直接拦截讯息。
          KeyBoard Hook的范例
          Hook Function的三个叁数
          nCode                wParam                             lParam                    传回值
          ===========          ========================== ==============            ================
          HC_ACTION            表按键Virtual Key                  与WM_KEYDOWN同          若讯息要被处理传0
          或                                                                反之传1
          HC_NOREMOVE
          Public hHook as Long
          Public Sub UnHookKBD()
          If hnexthookproc <> 0 Then
                      UnhookWindowsHookEx hHook
                      hHook = 0
          End If
          End Sub
          Public Function EnableKBDHook()
          If hHook <> 0 Then
                      Exit Function
          End If
          hhook = SetWindowsHookEx(WH_KEYBOARD, AddressOf _
                              MyKBHFunc, App.hInstance, App.ThreadId)
          End Function
          Public Function MyKBHFunc(ByVal iCode As Long, _
                      ByVal wParam As Long, ByVal lParam As Long) As Long
                    MyKBHfunc = 0 '表示要处理这个讯息
                    If wParam = vbKeySnapshot Then          '侦测 有没有按到PrintScreen键
          


          IP属地:中国香港7楼2010-06-20 17:11
          回复

            Dim mt as MyType
            mt.MyPtr = FnPtrToLong(AddressOf MyCallBackFunction)
            子类派生
            利用子类派生技术,可以截取发送到控件或窗体的消息。通过截取这些消息,可以编写自己的代码来改变或者扩展对象的行为。类的派生技术比较复杂,对它的全面讨论将超出本书的范围。下例只能提供该技术的大致轮廓。
            重点    当 Visual Basic 处于中断模式时,不允许调用 vtable 方法或 AddressOf 函数。为了保证安全,Visual Basic 仅仅将 0 返回到 AddressOf 函数的调用者。对于子类派生情况,这意味着 WindowProc 将 0 返回到 Windows。Windows 要求它的许多消息返回非 0 值,因此返回的常数 0 将导致 Windows 与 Visual Basic 之间的死锁,从而迫使进程终止。
            在下例中,应用程序包括一个简单的窗体,其中只有两个命令按钮。代码的作用是截取发送到窗体的 Windows 消息,并在“立即”窗口中打印出这些消息的值。
            代码的第一部分是声明部分,包括 API 函数声明,常数声明和变量声明:
            Declare Function CallWindowProc Lib "user32" Alias _
            "CallWindowProcA" (ByVal lpPrevWndFunc As Long, _
                ByVal hwnd As Long, ByVal Msg As Long, _
                ByVal wParam As Long, ByVal lParam As Long) As Long
            Declare Function SetWindowLong Lib "user32" Alias _
            "SetWindowLongA" (ByVal hwnd As Long, _
            ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
            Public Const GWL_WNDPROC = -4
            Global lpPrevWndProc As Long
            Global gHW As Long
            下一步,使用两个例程“钩入”消息流。第一个过程 (Hook) 调用了 SetWindowLong 函数,它使用了 GWL_WNDPROC 索引来创建窗口类的子类,窗口类是用来创建窗口的。然后它使用 AddressOf 关键字和回调函数 (WindowProc) 来截取消息并在“立即”窗口中打印消息的值。第二个过程 (Unhook) 关闭了子类,重新使原来的 Windows 过程成为回调函数。
            Public Sub Hook()
                lpPrevWndProc = SetWindowLong(gHW, GWL_WNDPROC, _
                AddressOf WindowProc)
            End Sub
            Public Sub Unhook()
                Dim temp As Long
                temp = SetWindowLong(gHW, GWL_WNDPROC, _
                lpPrevWndProc)
            End Sub
            Function WindowProc(ByVal hw As Long, ByVal uMsg As _
            Long, ByVal wParam As Long, ByVal lParam As Long) As _
            Long
                Debug.Print "Message: "; hw, uMsg, wParam, lParam
                WindowProc = CallWindowProc(lpPrevWndProc, hw, _
                uMsg, wParam, lParam)
            End Function
            最后,窗体的代码设置了 hWnd 的初始值,按钮的代码仅仅调用了上面的两个例程:
            Private Sub Form_Load()
                gHW = Me.hwnd
            End Sub
            Private Sub Command1_Click()
                Hook
            End Sub
            Private Sub Command2_Click()
                Unhook
            End Sub
            使用函数指针的局限与风险
            使用函数指针是有风险的。每当调用 DLL 的时候,就失去了 Visual Basic 开发环境的稳定性,使用函数指针的危险性就更大了,因为它很容易导致应用程序失败并因此而丢失已完成的工作。在工作的时候必须经常地保存和备份工作成果。下面列出了使用函数指针的一些注意事项:
            调试。在中断模式下,如果应用程序引发了回调函数,那么回调函数将被正常执行,但是断点和单步设置将被忽略。如果回调函数产生了异常,则可以捕捉到它并返回当前值。在中断模式下,如果堆栈上有回调函数,那么禁止复位。
            


            IP属地:中国香港9楼2010-06-20 17:11
            回复

              形实转换程序。形实转换是 Windows 实现代码重定位的手段。如果在中断模式下删除回调函数,它的形实转换程序将被修改返回 0。该值通常总是正确的,但是也有意外的情况。如果在中断模式下先删除了一个回调函数,然后又再次将其加入,那么有些被调用者可能对新的函数地址一无所知。在 .exe 中不使用形实转换程序,指针被直接传递到入口点。
              被传递的函数的签名有误。如果函数的参数个数与调用者期望的不一致,或者在调用某个参数时错误地使用 ByRef 或 ByVal,则应用程序可能会失败。因此,在传递函数时签名一定要正确。
              将函数传递给不存在的 Windows 过程。在对某个窗口进行子类派生的时候,需要将一个函数指针作为 Windows 过程 (WindowProc) 传递给 Windows。但是,在 IDE 中运行应用程序时,在调用 WindowProc 时下一层函数可能已经被破坏了。这可能导致一般性保护错误,并使 Visual Basic 开发环境遭到破坏。
              不支持“Basic 到 Basic”的函数指针。在 Visual Basic 的内部不能传递指向 Visual Basic 函数的指针。目前,只支持从 Visual Basic 到 DLL 函数的指针。
              回调过程中包含错误。回调过程中的任何错误都不应回传最初调用它的外部过程,这是很重要的。可以通过在回调过程的开始加上 On Error Resume Next 语句来实现。
              ------------------------------------------------------------------------------------------------------------------------------------------------------------------------
              hook是WINDOWS提供的一种消息处理机制,它使得程序员可以使用子过程来监视系统消息,并在消息到达目标过程前得到处理。
              下面将介绍WINNDOWS HOOKS并且说明如何在WINDOWS 程序中使用它。
              关于HOOKS
              使用HOOK 将会降低系统效率,因为它增加了系统处量消息的工作量。建议在必要时才使用HOOK,并在消息处理完成后立即移去该HOOK。
              HOOK链
              WINDOWS提供了几种不同类型的HOOKS;不同的HOOK可以处理不同的消息。例如,WH_MOUSE HOOK用来监视鼠标消息。
              WINDOWS为这几种HOOKS维护着各自的HOOK链。HOOK链是一个由应用程序定义的回调函数队列,当某种类型的消息发生时,WINDOWS向此种类型的HOOK链的第一个函数发送该消息,在第一函数处理完该消息后由该函数向链表中的下一个函数传递消息,依次向下。如果链中某个函数没有向下传送该消息,那么链表中后面的函数将得不到此消息。(对于某些类型的HOOK,不管HOOK链中的函数是否向下传递消息,与此类型HOOK联系的所有HOOK函数都会收到系统发送的消息)
              HOOK过程
              为了拦截特定的消息,你可以使用SetWindowsHookEx函数在该类型的HOOK链中安装你自己的HOOK函数。该函数语法如下:
              public function MyHook(nCode,wParam,iParam) as long
              ‘加入代码
              end function
              其中MyHook可以随便命名,其它不能变。该函数必须放在模块段。nCode指定HOOK类型。wParam,iParam的取值随nCode不同而不同,它代表了某种类型的HOOK的某个特定的动作。
              SetWindowsHookEx总是将你的HOOK函数放置在HOOK链的顶端。你可以使用CallNextHookEx函数将系统消息传递给HOOK链中的下一个函数。
              [注释]对于某些类型的HOOK,系统将向该类的所有HOOK函数发送消息,这时,HOOK函数中的CallNextHookEx语句将被忽略。
              全局HOOK函数可以拦截系统中所有线程的某个特定的消息(此时该HOOK函数必须放置在DLL中),局部HOOK函数可以拦截指定线程的某特定消息(此时该HOOK函数可以放置在DLL中,也可以放置在应用程序的模块段)。
              [注释] 建议只在调试时使用全局HOOK函数。全局HOOK函数将降低系统效率,并且会同其它使用该类HOOK的应用程序产生冲突。
              


              IP属地:中国香港10楼2010-06-20 17:11
              回复

                HOOK类型
                WH_CALLWNDPROC 和 WH_CALLWNDPROCRET HOOK
                WH_C ALLWNDPROC 和WH_CALLWNDPROCRET HOOK可以监视SendMessage发送的消息。系统在向窗体过程发送消息前,将调用WH_CALLWNDPROC;在窗体过程处理完该消息后系统将调用WH_CALLWNDPROCRET。
                WH_CALLWNDPROCRET HOOK会向HOOK过程传送一个CWPRETSTRUCT结构的地址。该结构包含了窗体过程处理系统消息后的一些信息。
                WH_CBT Hook
                系统在激活,创建,消毁,最小化,最大化,移动,改变窗体前;在完成一条系统命令前;在从系统消息队列中移去鼠标或键盘事件前;在设置输入焦点前,或同步系统消息队列前,将调用WH_CBT HOOK。你可以在你的HOOK 过程拦截该类HOOK,并返回一个值,告诉系统,是否继续执行上面的操作。
                WH_DEBUG HOOK
                系统在调用与某种HOOK类型联系的HOOK过程前,将调用WH_DEBUG ,应用程序可以使用该HOOK决定是否让系统执行某种类型的HOOK。
                WH_FOREGROUNDIDLE Hook
                系统在空闲时调用该HOOK,在后台执行优先权较低的应用程序。
                WH_GETMESSAGE Hook
                WH_GETMESSAGE Hook使应用程序可以拦截GetMessage 或 PeekMessage的消息。应用程序使用WH_GETMESSAGE HOOK监视鼠标、键盘输入和发送到队列中的其它消息。
                WH_JOURNALRECORD Hook
                WH_JOURNALRECORD Hook使应用程序可以监视输入事件。典型地,应用程序使用该HOOK记录鼠标、键盘输入事件以供以后回放。该HOOK是全局HOOK,并且不能在指定线程中使用。
                WH_JOURNALPLAYBACK Hook
                ` WH_JOURNALPLAYBACK Hook使应用程序可以向系统消息队列中插入消息。该HOOK可以回放以前由WH_JOURNALRECORD HOOK录制的鼠标、键盘输入事件。在WH_JOURNALPLAYBACK Hook安装到系统时,鼠标、键盘输入事件将被屏蔽。该HOOK同样是一个全局HOOK,不能在指定线程中使用。
                WH_JOURNALPLAYBACK Hook返回一个时间暂停值,它告诉系统,在处理当前回放的消息时,系统等待百分之几秒。这使得此HOOK可以控制在回放时的时间事件。
                WH_KEYBOARD Hook
                WH_KEYBOARD Hook使应用程序可以监视由GetMessage和PeekMessage返回的WM_KEYDOWN 及WM_KEYUP消息。应用程序使用该HOOK监视发送到消息队列中的键盘输入。
                WH_MOUSE Hook
                WH_MOUSE Hook 使应用程序可以监视由GetMessage和PeekMessage返回的消息。应用程序使用该HOOK监视发送到消息队列中的鼠标输入。
                WH_MSGFILTER and WH_SYSMSGFILTER Hooks
                WH_MSGFILTER 和WH_SYSMSGFILTER Hooks使应用程序可以监视菜单、滚动条、消息框、对话框,当用户使用ALT+TAB或ALT+ESC来切换窗体时,该HOOK也可以拦截到消息。WH_MSGFILTER仅在应用程序内部监视菜单、滚动条、消息框、对话框,而WH_SYSMSGFILTER则可以在系统内监视所有应用程序的这些事件。
                WH_SHELL Hook
                一个SHELL程序可以使用WH_SHELL Hook来接收重要的信息。当一个SHELL程序被激活前或当前窗体被创建、消毁时,系统会调用WH_SHELL Hook过程。
                使用HOOK
                安装、消毁HOOK过程
                监视系统事件
                安装、消毁HOOK过程
                使用SetWindowsHookEx函数,指定一个HOOK类型,自己的HOOK过程是全局还是局部HOOK,同时给出HOOK过程的进入点,就可以轻松的安装你自己的HOOK过程。
                Declare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" _
                             (ByVal idHook As Long, _
                               ByVal lpfn As Long,         _
                               ByVal hmod As Long,         _
                


                IP属地:中国香港11楼2010-06-20 17:11
                回复
                                 ByVal dwThreadId As Long) As Long
                  idHook代表是何种Hook,有以下几种
                             Public Const WH_CALLWNDPROC = 4
                             Public Const WH_CALLWNDPROCRET = 12
                             Public Const WH_CBT = 5
                             Public Const WH_DEBUG = 9
                             Public Const WH_FOREGROUNDIDLE = 11
                             Public Const WH_GETMESSAGE = 3
                             Public Const WH_HARDWARE = 8
                             Public Const WH_JOURNALPLAYBACK = 1
                             Public Const WH_JOURNALRECORD = 0
                             Public Const WH_KEYBOARD = 2
                             Public Const WH_MOUSE = 7
                             Public Const WH_MSGFILTER = (-1)
                             Public Const WH_SHELL = 10
                             Public Const WH_SYSMSGFILTER = 6
                  lpfn代表Hook Function所在的Address,这是一个CallBack Fucnction,当挂上某个Hook时,我们便得定义一个Function来当作某个讯息产生时,来处理它的Function,这个Hook Function有一定的叁数格式
                             Private Function HookFunc(ByVal nCode As Long, _
                                                     ByVal wParam As Long, _
                                                     ByVal lParam As Long ) As Long
                                 nCode 代表是什麽请况之下所产生的Hook,随Hook的不同而有不同组的可能值。
                                 wParam lParam 传回值则随Hook的种类和nCode的值之不同而不同。
                             因这个叁数是一个 Function的Address所以我们固定将Hook Function放在.Bas中,并以AddressOf HookFunc传入。至於Hook Function的名称我们可以任意给定,不一定叫 HookFunc
                  hmod 代表.DLL的hInstance,如果是Local Hook,该值可以是Null(VB中可传0进去),而如果是Remote Hook,则可以使用GetModuleHandle(".dll名称")来传入。
                  dwThreadId 代表执行这个Hook的ThreadId,如果不设定是那个Thread来做,则传0(所以一般来说,Remote Hook传0进去),而VB的Local Hook一般可传App.ThreadId进去。
                  


                  IP属地:中国香港12楼2010-06-20 17:11
                  回复
                    • 119.181.245.*
                    小雨说大话     我不想活了 没想到离编程师这么遥远呀


                    14楼2010-07-29 22:06
                    回复
                      回复:14楼
                      1.这个是Windows高级编程。。。你现在基础的基础都还没掌握好。。。这个要慢慢来的。。。
                      2.你是怎么找到这里来的啊?。。。。


                      IP属地:中国香港15楼2010-07-30 00:32
                      回复