鼠标键盘钩子的问题
动鼠标或者键盘lable1.text就加1
我一直动鼠标正常,但是一敲键盘就报错:
对“WindowsApplication1!WindowsApplication1.Form1+HookProc::Invoke”类型的已垃圾回收委托进行了回调。这可能会导致应用程序崩溃、损坏和数据丢失。向非托管代码传递委托时,托管应用程序必须让这些委托保持活动状态,直到确信不会再次调用它们。
下面是代码
Public Class Form1 Public Delegate Function HookProc(ByVal nCode As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As Integer Declare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" (ByVal idHook As Integer, ByVal lpfn As HookProc, ByVal hmod As Integer, ByVal dwThreadId As Integer) As Integer Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Integer) As Integer Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Integer, ByVal ncode As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As Integer Public hKeyBoardHook As Integer Public hMouseHook As Integer Public Const WH_MOUSE As Integer = 7 Public Const WH_KEYBOARD As Integer = 2 Private mHookProcedure As HookProc Public Sub UnHook() If hKeyBoardHook <> 0 Then UnhookWindowsHookEx(hKeyBoardHook) hKeyBoardHook = 0 End If If hMouseHook <> 0 Then UnhookWindowsHookEx(hMouseHook) hMouseHook = 0 End If End Sub Public Sub SetHook() If hKeyBoardHook = 0 Then mHookProcedure = New HookProc(AddressOf KBHookProc) hKeyBoardHook = SetWindowsHookEx(WH_KEYBOARD, mHookProcedure, 0, System.AppDomain.GetCurrentThreadId()) End If If hMouseHook = 0 Then mHookProcedure = New HookProc(AddressOf MSHookProc) hMouseHook = SetWindowsHookEx(WH_MOUSE, mHookProcedure, 0, System.AppDomain.GetCurrentThreadId()) End If End Sub Public Function MSHookProc(ByVal nCode As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As Integer Me.Label1.Text += 1 hKeyBoardHook = CallNextHookEx(hMouseHook, nCode, wParam, lParam) Return hKeyBoardHook End Function Public Function KBHookProc(ByVal nCode As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As Integer Me.Label1.Text += 1 KBHookProc = CallNextHookEx(hKeyBoardHook, nCode, wParam, lParam) Return KBHookProc End Function Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click SetHook() End Sub Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing UnHook() End SubEnd Class