为什么Windows会在KeyDown上发出哔声,但在DoubleClick上却没有?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么Windows会在KeyDown上发出哔声,但在DoubleClick上却没有?相关的知识,希望对你有一定的参考价值。

我希望这将是一个非常快速的问题:我在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事件上,而我在这里做错了什么?

答案

首先,我要指出你的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

以上是关于为什么Windows会在KeyDown上发出哔声,但在DoubleClick上却没有?的主要内容,如果未能解决你的问题,请参考以下文章

无法在文本框 keydown 事件上禁用哔声

击中钥匙时发出不必要的哔声

c#避免按键按下时发出哔哔声?

Java 错误提示音

为啥我在这个程序上听到哔哔声? [复制]

如何在 Windows 上禁用 emacs 中的哔声