2016-02-28 48 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