2017-09-16 40 views
0

我想在不添加Form類的情況下使用RegisterHotkey。將RegisterHotKey API與NativeWindow類一起使用?

現在我有一個「空項目(.NET Framework)Visual Basic」,其中包含兩個類,如下所示。

Imports System.Windows.Forms 
Public Class AppCore 
Inherits ApplicationContext 

Public myHotkeys As New clsHotkey 

Shared Sub main() 
    Console.WriteLine("starting " & Now) 
    Dim myAppCore As AppCore 
    myAppCore = New AppCore 
    System.Windows.Forms.Application.Run(myAppCore) 
End Sub 

Public Const MOD_CONTROL As Integer = &H11 
Public Const MOD_SHIFT As Integer = &H10 
Public Const MOD_ALT As Integer = &H1 
Public Const WM_HOTKEY As Integer = &H312 
Public Declare Function RegisterHotKey Lib "user32.dll" Alias "RegisterHotKey" (ByVal hwnd As IntPtr, ByVal id As Integer, ByVal fsModifiers As Integer, ByVal vk As Integer) As Integer 
Public Declare Function UnregisterHotKey Lib "user32.dll" Alias "UnregisterHotKey" (ByVal hwnd As IntPtr, ByVal id As Integer) As Integer 

Sub New() 
    RegisterHotKey(myHotkeys.Handle, 100, 0, Keys.F6) 
    RegisterHotKey(myHotkeys.Handle, 200, MOD_ALT, Keys.F7) 
End Sub 

End Class 

Imports System.Windows.Forms 
Public Class clsHotkey 
Inherits NativeWindow 

Public Const WM_HOTKEY As Integer = &H312 

Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message) 
    MyBase.WndProc(m) 
    Beep() 

    If m.Msg = WM_HOTKEY Then 
     Select Case CType(m.WParam, Integer) 
      Case 100 
       Console.WriteLine("ID 100") 
      Case 200 
       Console.WriteLine("ID 200") 
     End Select 
    End If 
End Sub 

End Class 

現在,這將編譯沒有錯誤,並運行。

在clsHotKey的WndProc中,我放了一個Beep(),但是這個永遠不會被調用。

我用來構建它的原始示例在Form類上使用DefWndProc,但NativeWindow的DefWndProc不能根據IDE覆蓋。

我試過重新啓動計算機,以防萬一熱鍵的鉤子沒有釋放,但事實並非如此。

我不知道這裏有什麼問題。有什麼方法可以觀察Windows事件分發系統,也許可以找出消息結束的位置以及爲什麼它不觸發WndProc?

謝謝!

回答

1
RegisterHotKey(myHotkeys.Handle, 100, 0, Keys.F6) 

它是可調試的,你可以看到myHotkeys.Handle爲零。不太確定如何出錯,使用Beep()來調試代碼是一個提示。沒有必要,你可以簡單地使用斷點。

您可能已經習慣了Form.Handle屬性,當您使用該屬性時,它會自動創建窗口以確保Handle有效。但這不是NativeWindow所做的,你必須要問。修復:

Sub New() 
    myHotkeys.CreateHandle(New CreateParams()) 
    RegisterHotKey(myHotkeys.Handle, 100, 0, Keys.F6) 
    ... 
End Sub 

現在工作正常。

+0

神奇的,這很好!現在我相信我有最簡單的熱鍵+系統菜單應用程序可行。我從來沒有想過檢查NativeWindow是否會初始化它的句柄,我認爲這基本上是唯一的目的,有這些函數的句柄。謝謝 !! – Shodan

相關問題