Почему Windows воспроизводит звуковой сигнал на KeyDown, а не на DoubleClick? - PullRequest
0 голосов
/ 07 сентября 2018

Я надеюсь, что это будет очень быстрый вопрос: У меня есть TreeView в форме Windows.

Я запускаю этот код для открытия каталогов, отображаемых в виде дерева:

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 голосов
/ 07 сентября 2018

Во-первых, позвольте мне указать, что ваш метод 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
...