首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将RegisterHotKey API与NativeWindow类一起使用?

将RegisterHotKey API与NativeWindow类一起使用?
EN

Stack Overflow用户
提问于 2017-09-16 00:20:33
回答 1查看 164关注 0票数 0

我试图在不添加表单类的情况下使用RegisterHotkey。

现在,我有一个“空项目(.NET框架) Visual”,其中包含两个类,如下所示。

代码语言:javascript
复制
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?

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-09-19 22:27:49

代码语言:javascript
复制
RegisterHotKey(myHotkeys.Handle, 100, 0, Keys.F6)

它是可调试的,您可以看到myHotkeys.Handle是零。不太确定这是如何出错的,使用Beep()来调试代码是一个提示。没有必要,只需使用断点即可。

您可能已经习惯了Form.Handle属性,当您使用该属性时,它还会自动创建窗口以确保句柄是有效的。但这不是NativeWindow所做的,你必须问。修正:

代码语言:javascript
复制
Sub New()
    myHotkeys.CreateHandle(New CreateParams())
    RegisterHotKey(myHotkeys.Handle, 100, 0, Keys.F6)
    ...
End Sub

现在工作得很好。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46248914

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档