为什么Windows在KeyDown而不是DoubleClick上播放蜂鸣声?

时间:2018-09-06 22:13:18

标签: vb.net winforms treeview onkeydown beep

我希望这将是一个真正的快速问题: 我在Windows窗体上有一个TreeView。

我运行以下代码打开目录,以树状视图显示

Private Sub OpenFolder()
    Try
        System.Diagnostics.Process.Start(SelectedDir)
    Catch ex As Exception
        MessageBox.Show("Mappen " & SelectedDir & " kan ikke åbnes!")
    End Try
End Sub

当我从OpenFolder()事件中呼叫KeyDown时:

Private Sub TreeViewDir_KeyDown(sender As Object, e As KeyEventArgs) Handles TreeViewDir.KeyDown
    If e.KeyCode = Keys.Enter Then
        OpenFolder()
        e.SuppressKeyPress = True
    ElseIf e.KeyCode = Keys.Delete Then
        DeleteFolder()
        e.SuppressKeyPress = True
    End If
End Sub

..我收到Windows错误声音。但是没有错误信息。令我沮丧的是,这个潜艇可以完全启动该功能。

Private Sub TreeViewDir_DoubleClick(sender As Object, e As EventArgs) Handles TreeViewDir.DoubleClick
    OpenFolder()
End Sub

打开文件夹时会播放错误声音,但同样,只能在KeyDown上播放。有人可以告诉我为什么仅在KeyDown事件上会发生这种情况,而我在这里做错了吗?

1 个答案:

答案 0 :(得分:0)

首先,让我指出,您的OpenFolder()方法不负责发出蜂鸣声,KeyPress事件则不负责。这是Windows的标准行为,当在不需要执行任何操作的情况下按下某个键时即可。

现在,将SuppressKeyPress设置为true,实际上应该可以防止触发KeyPress事件,因此,不应播放任何提示音。但是,在某些情况下,当您在KeyDown事件中执行某些代码时,击键可能需要一段时间才能被抑制,从而导致发出哔声。

要解决此问题,您只需订阅KeyPress事件并将e.Handled设置为true:

Private Sub TreeViewDir_KeyPress(sender As Object, e As KeyPressEventArgs) Handles TreeViewDir.KeyPress
    If e.KeyChar = ChrW(Keys.Enter) Then e.Handled = True
End Sub

如果您不想使用KeyDown,另一种解决方案是通过延迟执行方法留出一些时间来抑制按键输入:

Private Async Sub TreeViewDir_KeyDown(sender As Object, e As KeyEventArgs) Handles TreeViewDir.KeyDown
    '   ^^^^^ ⟸ Don't forget the Async keyword.

    If e.KeyCode = Keys.Enter Then
        e.SuppressKeyPress = True   ' This is first
        Await Task.Delay(100)       ' Followed by a small delay
        OpenFolder()                ' Then call the method.
    End If
End Sub