为啥 Windows 在 KeyDown 上播放哔声,但在 DoubleClick 上不播放?

Posted

技术标签:

【中文标题】为啥 Windows 在 KeyDown 上播放哔声,但在 DoubleClick 上不播放?【英文标题】:Why does windows play a beep sound on KeyDown, but not on DoubleClick?为什么 Windows 在 KeyDown 上播放哔声,但在 DoubleClick 上不播放? 【发布时间】:2018-09-06 22:13:18 【问题描述】:

我希望这是一个真正快速的问题: 我在 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

当我从KeyDown 事件中调用OpenFolder() 时:

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】:

首先,让我指出您的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 事件上禁用哔声

如何在 Java 中播放除哔哔声以外的声音?

在 C# 中的 keydown 上播放键值

为啥我不能在 td >p 元素上添加“keydown”事件?

在 keydown 上,为啥值的 console.log 与将值分配给对象不同?