【问题标题】:VB toggle specific form with key press eventsVB 使用按键事件切换特定表单
【发布时间】:2016-07-18 04:00:55
【问题描述】:

您好,当按下一组特定的键时,我无法显示表单。主窗体先运行;这是第二种形式,在按 ctrl+alt+shift+h 切换之前应该是隐藏的。这是我拥有的代码,我相信它应该可以工作,但事实并非如此。我试过这样,在一个每 1 毫秒检查一次新闻事件的计时器中

Private Sub tmrKeys_Tick(sender As Object, e As EventArgs) Handles tmrKeys.Tick
    Dim key As String = Nothing

    If My.Computer.Keyboard.AltKeyDown AndAlso My.Computer.Keyboard.CtrlKeyDown AndAlso My.Computer.Keyboard.ShiftKeyDown AndAlso key = "H" Then
        Dim x = New form2()
        x.Show()
    End If
End Sub

我还尝试了这样一个单独的函数:

Private Sub form1_KeyDown(sender As Object, e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown
    If e.Control AndAlso e.Alt AndAlso e.Shift AndAlso e.KeyCode = Keys.H Then
        form2.Show()
    End If
End Sub

提前感谢您的帮助。

【问题讨论】:

  • 你绝对不应该使用Timer。在任何情况下都不会。第一个问题是您是否希望此组合键仅在主窗体具有焦点时起作用,或者不管哪个窗口具有焦点。如果是后者,那么您需要使用 Windows API 来注册热键。对于前者,您的第二个代码 sn-p 是正确的,但如果表单上有可选控件,则默认情况下表单不会引发 KeyDown 事件。要让这样的表单引发 keybaod 事件,您必须将其 KeyPreview 属性设置为 True
  • 无论窗体的焦点如何,都需要在按键时进行切换。
  • 在这种情况下,处理表单的事件是没有用的,因为如果表单没有焦点,则无法引发这些事件。您应该查看RegisterHotKey API。您将能够通过搜索找到大量示例。只需确保您使用专门的 VB.NET 示例或对 VB6 示例进行适当的更改。

标签: .net vb.net keypress keydown


【解决方案1】:

这就是我要找的。感谢 @jmcilhinney 向 RegisterHotKey 提供有关如何注册活动热键的提示。此代码将热键设置为 alt+UPKEY。我想弄清楚如何修改参数以分配超过 2 个键,例如 CTRL+ALT+SHIFT+UPKEY。但我必须去上班,所以我今晚会继续工作,明天更新给大家,除非一个急切的海狸想在我工作的时候告诉我如何做到这一点,哈哈。再次感谢所有帮助过的人!

Public Class Form1

Public Declare Function RegisterHotKey Lib "user32" (ByVal hwnd As IntPtr, ByVal id As Integer, ByVal fsModifiers As Integer, ByVal vk As Integer) As Integer
Public Declare Function UnregisterHotKey Lib "user32" (ByVal hwnd As IntPtr, ByVal id As Integer) As Integer
Public Const WM_HOTKEY As Integer = &H312


Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
    If m.Msg = WM_HOTKEY Then
        Form2.Show()
    End If

    MyBase.WndProc(m)

End Sub


Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
    Call UnregisterHotKey(Me.Handle, 9)

End Sub


Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    Call RegisterHotKey(Me.Handle.ToInt32, 0, &H1, 38) '<-- registers specific hotkeys

End Sub
End Class 

【讨论】:

    【解决方案2】:

    您的代码看起来不错(不需要计时器)。我认为您缺少的是 KeyPreviewTrue 的设置

    当该属性设置为true时,表单将接收所有 KeyPress、KeyDown 和 KeyUp 事件

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Form1.KeyPreview = True
    End Sub
    

    那么这应该可以工作:

    Private Sub form1_KeyDown(sender As Object, e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown
        If e.Control AndAlso e.Alt AndAlso e.Shift AndAlso e.KeyCode = Keys.H Then
            form2.Show()
        End If 
    End Sub
    

    【讨论】:

    • 那句话非常不准确,没有 KeyPress 或 KeyUp 也不是所有的键。你从哪里复制的?
    • @HansPassant - 它在我链接到msdn.microsoft.com/en-us/library/…的 MSDN 页面上
    • @BanForFun - 如果不设置此属性(VS2015),它对我不起作用
    • 显示的方法都不起作用。仍然没有切换。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-18
    • 1970-01-01
    相关资源
    最近更新 更多