wilwu 2020-01-19 13:16 采纳率: 0%
浏览 214

在VBA中同时启用了两个钩子,但只能释放一个怎么回事?

我想通过HOOK同时监控鼠标和键盘的操作,获得鼠标的当前坐标和我按下的按键码。
鼠标这个hook没有问题,但是当我加上键盘hook时候,发现释放不了键盘的hook.
点击结束后,鼠标hook停止了但是键盘还在继续运行。请各位帮帮我。
代码如下:

Sub UNHOOK() '卸钩子
    UnhookWindowsHookEx Mhook2
    UnhookWindowsHookEx Mhook
    Mhook2 = 0
    Mhook = 0

End Sub
Sub MOUSEHOOK()
    Mhook = SetWindowsHookEx(WH_MOUSE_LL, AddressOf MyMhook, Application.Hinstance, 0)
    Mhook2 = SetWindowsHookEx(WH_KEYBOARD_LL, AddressOf MyMhookkey, Application.Hinstance, 0)
    If Mhook = 0 Then MsgBox "钩子注册失败"
    If Mhook2 = 0 Then MsgBox "钩子注册失败"
End Sub
Public Function MyMhook(ByVal ncode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    If ncode = 0 Then
        If wParam = WM_MOUSEMOVE Then
            Dim p As POINTAPI
            GetCursorPos p
            GetmousePos.TextBox1.Value = p.X & "," & p.Y
        End If
    Else
        MyMhook = CallNextHookEx(Mhook, ncode, wParam, lParam)
    End If
    MyMhook = CallNextHookEx(Mhook, ncode, wParam, lParam)
End Function
Public Function MyMhookkey(ByVal ncode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    If ncode = 0 Then
        If wParam = WM_KEYDOWN Then
            CopyMemory mymsg, ByVal lParam, LenB(mymsg)
            a = Chr(mymsg.vKey)
            MsgBox mymsg.vKey
        End If
    Else
        MyMhookkey = CallNextHookEx(Mhook2, ncode, wParam, lParam)
    End If
    MyMhookkey = CallNextHookEx(Mhook2, ncode, wParam, lParam)
End Function
  • 写回答

1条回答 默认 最新

  • 你知我知皆知 2024-07-26 11:29
    关注

    以下回答参考 皆我百晓生券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。

    你使用了两种不同的钩子(HOOK)来监听鼠标和键盘操作。这可能是因为你尝试同时挂接了这两种类型的钩子,导致无法正确地解除钩子。以下是一个修复这些问题的示例:

    Sub UNHOOK()
        UnhookWindowsHookEx Mhook2
        UnhookWindowsHookEx Mhook
        Mhook2 = 0
        Mhook = 0
    End Sub
    
    Sub MOUSEHOOK()
        Set Mhook = SetWindowsHookEx(WH_MOUSE_LL, AddressOf MyMhook, Application.Hinstance, 0)
    
        If Mhook = 0 Then
            MsgBox "钩子注册失败"
        End If
    End Sub
    
    Sub KEYBOARDHOOK()
        Set Mhook2 = SetWindowsHookEx(WH_KEYBOARD_LL, AddressOf MyMhookkey, Application.Hinstance, 0)
    
        If Mhook2 = 0 Then
            MsgBox "钩子注册失败"
        End If
    End Sub
    
    Public Function MyMhook(ByVal ncode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
        If ncode = 0 Then
            If wParam = WM_MOUSEMOVE Then
                Dim p As POINTAPI
                GetCursorPos p
                GetmousePos.TextBox1.Value = p.X & "," & p.Y
            End If
        Else
            MyMhook = CallNextHookEx(Mhook, ncode, wParam, lParam)
        End If
    End Function
    
    Public Function MyMhookkey(ByVal ncode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
        If ncode = 0 Then
            If wParam = WM_KEYDOWN Then
                CopyMemory mymsg, ByVal lParam, LenB(mymsg)
                a = Chr(mymsg.vKey)
                MsgBox mymsg.vKey
            End If
        Else
            MyMhookkey = CallNextHookEx(Mhook2, ncode, wParam, lParam)
        End If
    End Function
    

    在这个例子中,我们创建了两个新的钩子函数 MOUSEHOOKKEYBOARDHOOK 来分别监听鼠标和键盘事件。然后,在 UNHOOK 函数中,我们取消了这两个钩子,并且只保留了一个钩子。

    这样,你就可以同时监听鼠标和键盘事件而不会冲突。

    评论

报告相同问题?