2017-09-16 64 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