我希望这将是一个真正的快速问题: 我在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事件上会发生这种情况,而我在这里做错了吗?
答案 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