我试图在不添加表单类的情况下使用RegisterHotkey。
现在,我有一个“空项目(.NET框架) Visual”,其中包含两个类,如下所示。
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现在,这将编译没有错误,并运行。
在WndProc of clsHotKey中,我放了Beep(),但它从未被调用。
我用来构建这个的最初示例使用了表单类上的DefWndProc,但是根据IDE,NativeWindow的DefWndProc是不可重写的。
我试过重新启动电脑,以防热键的钩子没有释放,但仅此而已。
我不知道这是怎么回事。有没有任何方法可以监视windows事件分发系统,也许可以找出消息在哪里结束,以及为什么它不触发WndProc?
谢谢!
发布于 2017-09-19 22:27:49
RegisterHotKey(myHotkeys.Handle, 100, 0, Keys.F6)它是可调试的,您可以看到myHotkeys.Handle是零。不太确定这是如何出错的,使用Beep()来调试代码是一个提示。没有必要,只需使用断点即可。
您可能已经习惯了Form.Handle属性,当您使用该属性时,它还会自动创建窗口以确保句柄是有效的。但这不是NativeWindow所做的,你必须问。修正:
Sub New()
myHotkeys.CreateHandle(New CreateParams())
RegisterHotKey(myHotkeys.Handle, 100, 0, Keys.F6)
...
End Sub现在工作得很好。
https://stackoverflow.com/questions/46248914
复制相似问题