2016-02-28 50 views
-1

我试图禁用Windows键。转Bt基因在运行应用程序我得到一个错误“检测CallbackOnCollectedDelegate”下面是我的代码“检测到CallbackOnCollectedDelegate”

Declare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" (ByVal idHook As Integer, ByVal lpfn As LowLevelKeyboardProcDelegate, ByVal hMod As IntPtr, ByVal dwThreadId As Integer) As IntPtr 
Declare Function UnhookWindowsHookEx Lib "user32" Alias "UnhookWindowsHookEx" (ByVal hHook As IntPtr) As Boolean 
Declare Function CallNextHookEx Lib "user32" Alias "CallNextHookEx" (ByVal hHook As IntPtr, ByVal nCode As Integer, ByVal wParam As Integer, ByRef lParam As KBDLLHOOKSTRUCT) As Integer 
Delegate Function LowLevelKeyboardProcDelegate(ByVal nCode As Integer, ByVal wParam As Integer, ByRef lParam As KBDLLHOOKSTRUCT) As Integer 

Const WH_KEYBOARD_LL As Integer = 13 

Structure KBDLLHOOKSTRUCT 
    Dim vkCode As Integer 
    Dim scanCode As Integer 
    Dim flags As Integer 
    Dim time As Integer 
    Dim dwExtraInfo As Integer 
End Structure 

Dim intLLKey As IntPtr 

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 
    intLLKey = SetWindowsHookEx(WH_KEYBOARD_LL, AddressOf LowLevelKeyboardProc, IntPtr.Zero, 0) 
End Sub 

Private Sub Form1_FormClosing(sender As Object, e As FormClosingEventArgs) Handles MyBase.FormClosing 
    UnhookWindowsHookEx(intLLKey) 
End Sub 

Private Function LowLevelKeyboardProc(ByVal nCode As Integer, ByVal wParam As Integer, ByRef lParam As KBDLLHOOKSTRUCT) As Integer 
    Dim blnEat As Boolean = False 
    Select Case wParam 
     Case 256, 257, 260, 261 
      'Alt+Tab, Alt+Esc, Ctrl+Esc, Windows Key  
      blnEat = ((lParam.vkCode = 9) AndAlso (lParam.flags = 32)) Or 
      ((lParam.vkCode = 27) AndAlso (lParam.flags = 32)) Or 
      ((lParam.vkCode = 27) AndAlso (lParam.flags = 0)) Or 
      ((lParam.vkCode = 91) AndAlso (lParam.flags = 1)) Or 
      ((lParam.vkCode = 92) AndAlso (lParam.flags = 1)) 
    End Select 

    If blnEat = True Then 
     Return 1 
    Else 
     Return CallNextHookEx(IntPtr.Zero, nCode, wParam, lParam) 
    End If 
End Function 

任何帮助是非常赞赏

+0

你能显示其余的错误信息吗?如何运行代码? –

+0

这是完整的错误消息“Managed Debugging Assistant'CallbackOnCollectedDelegate'检测到'C:\ Users \ Louisa \ Documents \ Visual Studio 2015 \ Projects \ Amus \ Amus \ bin \ Debug \ Amus.vshost.exe'中存在问题。 附加信息:对类型为'Amus!Amus.Form1 + LowLevelKeyboardProcDelegate :: Invoke'的垃圾收集代理进行回调,这可能导致应用程序崩溃,损坏和数据丢失。将代理传递给非托管代码时,它们必须是通过托管应用程序保持活跃状态​​,直到确保它们永远不会被调用。“ – Louisa

回答

1

的问题是一样的this post。不同之处在于他们使用C#。但是,VB正在做同样的事情;为您生成一个委托。作为参考,这是您的表单的Load事件中反编译的代码的样子。

Private Sub Form1_Load(sender As Object, e As EventArgs) 
    Me.intLLKey = Form1.SetWindowsHookEx(13, New Form1.LowLevelKeyboardProcDelegate(Me.LowLevelKeyboardProc), IntPtr.Zero, 0) 
End Sub 

请注意,它正在为您创建一个LowLevelKeyboardProcDelegate委托。我不会在这里完全重复@HansPassant's answer,因为他在描述问题和解决方案方面做得非常出色;只能说你需要存储自己对LowLevelKeyboardProcDelegate委托的引用。

+0

问题是我不熟悉C#。我只知道vb.net – Louisa

+0

@Louisa然后使用许多C#到VB转换器之一来转换答案VB中的代码。 C#和VB做的事情基本相同,一种语言的代码通常可以翻译成另一种语言。 – Blackwood

+1

虽然我的观点是@Blackwood(例如ILSpy),但在概念上,您需要做的是将New LowLevelKeyboardProcDelegate(LowLevelKeyboardProc)的结果赋给成员变量,然后在调用SetWindowsHookEx时将该变量用作参数'。这将阻止您的回调委托收集车库。 – cokeman19