2

キーが離されると、キー アップ イベントがトリガーされます。これは、a、b などの通常のキーにも当てはまります。ただし、矢印キーまたはエスケープ キーを押したままにすると、異なる結果が生成されます。キーが離されたときにキー アップ イベントを発生させる代わりに、キー ダウン イベントの直後に発生させます。したがって、矢印キーを押し続けることは、キーを何度も非常に速く押して離すことと同じになります。キーが実際にいつ解放されるかを判断するための説明と回避策はありますか?

4

2 に答える 2

3

キーを離すまで、KeyUp イベントは実際には発生しません (矢印キーなどだけでなく、すべてのキーに対して)。多くの KeyDown イベントが繰り返されます。少なくとも、いくつかのテスト コードからはそう見えます。

私の回避策は、KeyDown イベントが検出された後に KeyDown ハンドラーを無効にすることです。

RemoveHandler Me.KeyDown, AddressOf Form1_KeyDown

KeyUP イベントが発生したときに再度有効にします。

AddHandler Me.KeyDown, AddressOf Form1_KeyDown

もちろん、同時に複数のキーを押したい場合、これは機能しません。問題のキーが既にダウンしているかどうかを保存し、それぞれの KeyDown イベントを無視する必要があります。

于 2009-02-10T10:12:00.470 に答える
1

私はちょうど同様の問題に遭遇しました。キーボード ハンドラの動作がおかしい:

フォーカスとハンドラーがテキスト ボックスにある場合:

  • 英数字キーを押したままにすると、複数の Press および Down イベントが発生しました
  • 矢印キーとファンクション キーは、複数のダウン イベントを生成します

KeyPreview が有効になっているフォームのイベントを処理する場合、矢印キーの KeyUp イベントのみが処理されます。

ProcessCmdKey をオーバーライドすることで、下位レベルのすべてのキーを処理できます。

左矢印キーを処理したい場合:

Protected Overrides Function ProcessCmdKey(ByRef msg As System.Windows.Forms.Message, ByVal keyData As System.Windows.Forms.Keys) As Boolean
    Select Case keyData
        Case Keys.Left
            Debug.WriteLine("Left")
            Return True
        Case Else
            Return MyBase.ProcessCmdKey(msg, keyData)
    End Select
End Function
于 2009-06-19T07:53:46.773 に答える