为什么 windows 在 KeyDown 上播放哔声,但在 DoubleClick 上不播放?
Why does windows play a beep sound on KeyDown, but not on 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
当我从 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 错误声音。但是没有错误信息。是什么让我感到困惑,是这个 sub 毫无问题地触发了这个功能。
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 表单上有一个 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 错误声音。但是没有错误信息。是什么让我感到困惑,是这个 sub 毫无问题地触发了这个功能。
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