说错了应该是子类的方法。。不是HOOK

解决方案 »

  1.   

    在该事件中加入了
    Private Sub UserControl_Terminate()
        UnSetHooks
    End Sub
    好象没有效果。。!!!
    如何检察钩子已经取消
      

  2.   

    Public Function WindowProc(ByVal hWnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
      Select Case uMsg
        Case WM_DESTROY
          UnSetHooks
          
        Case Else
          ……
        End Select
      ……
    End Function
      

  3.   

    SetWindowsHookEx是设置HOOK,关闭用另一个API,名子记不住了,你查一下MSDN,好象是UnSetWindowsHookEx吧。
      

  4.   

    下面的是 我的一个 hook 控件,我的 取消挂钩是:
    Public Sub RemoveHook()
       UnhookWindowsHookEx hAppHook
       UnhookWindowsHookEx hJournalHook
    End Sub用了 API 函数 UnhookWindowsHookEx 
    =================================================================
    VERSION 1.0 CLASS
    BEGIN
      MultiUse = -1  'True
    END
    Attribute VB_Name = "cSystemHook"
    Attribute VB_GlobalNameSpace = False
    Attribute VB_Creatable = True
    Attribute VB_PredeclaredId = False
    Attribute VB_Exposed = True
    Attribute VB_Ext_KEY = "SavedWithClassBuilder" ,"Yes"
    Attribute VB_Ext_KEY = "Top_Level" ,"Yes"
    Option Explicit
    ' System wide keyboard and mouse hookPublic Event MouseDown(Button As Integer, Shift As Integer, x As Single, y As Single)
    Public Event MouseUp(Button As Integer, Shift As Integer, x As Single, y As Single)
    Public Event MouseMove(Button As Integer, Shift As Integer, x As Single, y As Single)
    Public Event KeyDown(KeyCode As Integer, Shift As Integer)
    Public Event KeyUp(KeyCode As Integer, Shift As Integer)
    Public Event SystemKeyDown(KeyCode As Integer)
    Public Event SystemKeyUp(KeyCode As Integer)Private 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
    Private Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As Long
    Private Declare Function GetAsyncKeyState% Lib "user32" (ByVal vKey As Long)Private Const WM_KEYDOWN = &H100
    Private Const WM_KEYUP = &H101
    Private Const WM_MOUSEMOVE = &H200
    Private Const WM_LBUTTONDOWN = &H201
    Private Const WM_LBUTTONUP = &H202
    Private Const WM_LBUTTONDBLCLK = &H203
    Private Const WM_RBUTTONDOWN = &H204
    Private Const WM_RBUTTONUP = &H205
    Private Const WM_RBUTTONDBLCLK = &H206
    Private Const WM_MBUTTONDOWN = &H207
    Private Const WM_MBUTTONUP = &H208
    Private Const WM_MBUTTONDBLCLK = &H209
    Private Const WM_MOUSEWHEEL = &H20A
    Private Const WM_SYSTEMKEYDOWN = &H104
    Private Const WM_SYSTEMKEYUP = &H105Private Const WH_JOURNALRECORD = 0
    Private Const WH_GETMESSAGE = 3Private Type EVENTMSG
         wMsg As Long
         lParamLow As Long
         lParamHigh As Long
         msgTime As Long
         hWndMsg As Long
    End TypeDim EMSG As EVENTMSGPublic Function SetHook() As Boolean
       If hJournalHook = 0 Then hJournalHook = SetWindowsHookEx(WH_JOURNALRECORD, AddressOf JournalRecordProc, App.hInstance, 0)
       If hAppHook = 0 Then hAppHook = SetWindowsHookEx(WH_GETMESSAGE, AddressOf AppHookProc, App.hInstance, App.ThreadID)
       SetHook = True
    End FunctionPublic Sub RemoveHook()
       UnhookWindowsHookEx hAppHook
       UnhookWindowsHookEx hJournalHook
    End SubPrivate Sub Class_Initialize()
      SHptr = ObjPtr(Me)
    End SubPrivate Sub Class_Terminate()
      If hJournalHook Or hAppHook Then RemoveHook
    End SubFriend Function FireEvent(ByVal lParam As Long)
      Dim i%, j%, k%
      Dim s As String
      If lParam = WM_CANCELJOURNAL Then
         hJournalHook = 0
         SetHook
         Exit Function
      End If
      
      CopyMemory EMSG, ByVal lParam, Len(EMSG)
      Select Case EMSG.wMsg
        Case WM_KEYDOWN
             j = 0
             If GetAsyncKeyState(vbKeyShift) Then j = (j Or 1)        'fixed by JJ
             If GetAsyncKeyState(vbKeyControl) Then j = (j Or 2)      'fixed by JJ
             If GetAsyncKeyState(vbKeyMenu) Then j = (j Or 4)         'fixed by JJ
             s = Hex(EMSG.lParamLow)
             k = (EMSG.lParamLow And &HFF)
             RaiseEvent KeyDown(k, j)
             s = Left$(s, 2) & Right$("00" & Hex(k), 2)               'fixed by JJ
             EMSG.lParamLow = CLng("&h" & s)
             CopyMemory ByVal lParam, EMSG, Len(EMSG)
        Case WM_KEYUP
             j = 0                                                    'fixed by JJ
             If GetAsyncKeyState(vbKeyShift) Then j = (j Or 1)        'fixed by JJ
             If GetAsyncKeyState(vbKeyControl) Then j = (j Or 2)      'fixed by JJ
             If GetAsyncKeyState(vbKeyMenu) Then j = (j Or 4)         'fixed by JJ
             s = Hex(EMSG.lParamLow)
             k = (EMSG.lParamLow And &HFF)
             RaiseEvent KeyUp(k, j)
             s = Left$(s, 2) & Right$("00" & Hex(k), 2)               'fixed by JJ
             EMSG.lParamLow = CLng("&h" & s)
             CopyMemory ByVal lParam, EMSG, Len(EMSG)
        Case WM_MOUSEMOVE
             i = 0                                                    'fixed by JJ
             If GetAsyncKeyState(vbKeyLButton) Then i = (i Or 1)      'fixed by JJ
             If GetAsyncKeyState(vbKeyRButton) Then i = (i Or 2)      'fixed by JJ
             If GetAsyncKeyState(vbKeyMButton) Then i = (i Or 4)      'fixed by JJ
             j = 0                                                    'fixed by JJ
             If GetAsyncKeyState(vbKeyShift) Then j = (j Or 1)        'fixed by JJ
             If GetAsyncKeyState(vbKeyControl) Then j = (j Or 2)      'fixed by JJ
             If GetAsyncKeyState(vbKeyMenu) Then j = (j Or 4)         'fixed by JJ
             RaiseEvent MouseMove(i, j, CSng(EMSG.lParamLow), CSng(EMSG.lParamHigh))
        Case WM_LBUTTONDOWN, WM_RBUTTONDOWN, WM_MBUTTONDOWN
             i = 0                                                    'fixed by JJ
             If GetAsyncKeyState(vbKeyShift) Then i = (i Or 1)        'fixed by JJ
             If GetAsyncKeyState(vbKeyControl) Then i = (i Or 2)      'fixed by JJ
             If GetAsyncKeyState(vbKeyMenu) Then i = (i Or 4)         'fixed by JJ
             RaiseEvent MouseDown(2 ^ ((EMSG.wMsg - 513) / 3), i, CSng(EMSG.lParamLow), CSng(EMSG.lParamHigh))
        Case WM_LBUTTONUP, WM_RBUTTONUP, WM_MBUTTONUP
             i = 0                                                    'fixed by JJ
             If GetAsyncKeyState(vbKeyShift) Then i = (i Or 1)        'fixed by JJ
             If GetAsyncKeyState(vbKeyControl) Then i = (i Or 2)      'fixed by JJ
             If GetAsyncKeyState(vbKeyMenu) Then i = (i Or 4)         'fixed by JJ
             RaiseEvent MouseUp(2 ^ ((EMSG.wMsg - 514) / 3), i, CSng(EMSG.lParamLow), CSng(EMSG.lParamHigh))
        Case WM_SYSTEMKEYDOWN
             s = Hex(EMSG.lParamLow)
             k = (EMSG.lParamLow And &HFF)
             If k <> vbKeyMenu Then RaiseEvent SystemKeyDown(k)
             s = Left$(s, 2) & Right$("00" & Hex(k), 2)               'fixed by JJ
             EMSG.lParamLow = CLng("&h" & s)
             CopyMemory ByVal lParam, EMSG, Len(EMSG)
        Case WM_SYSTEMKEYUP
             s = Hex(EMSG.lParamLow)
             k = (EMSG.lParamLow And &HFF)
             If k <> vbKeyMenu Then RaiseEvent SystemKeyUp(k)
             s = Left$(s, 2) & Right$("00" & Hex(k), 2)               'fixed by JJ
             EMSG.lParamLow = CLng("&h" & s)
             CopyMemory ByVal lParam, EMSG, Len(EMSG)
        Case Else
      End Select
    End Function