我想在不添加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?
谢谢!
神奇的,这很好!现在我相信我有最简单的热键+系统菜单应用程序可行。我从来没有想过检查NativeWindow是否会初始化它的句柄,我认为这基本上是唯一的目的,有这些函数的句柄。谢谢 !! – Shodan