VB.NET|任意のタイミングでキーボードの状態を取得

 フレームごとに計算をするゲームのプログラムなんかだと、イベント発生時以外にキーボードの状態を取得したいと思うでしょう。

 そこで通常ならDirectInputを使うのでしょうが、あえて使わないで解決してみようと書いたコードがこれ。今回はVB2005です。

Imports System.Windows.Forms

Module KeysState

    Dim keysState As New Dictionary(Of Keys, List(Of Boolean))

    ''' <summary>
    ''' 毎フレーム呼び出す
    ''' </summary>
    Public Sub UpDate()
        For Each key As Keys In keysState.Keys
            keysState(key).RemoveAt(1)
            keysState(key).Add(keysState(key)(0))
        Next
    End Sub

    ''' <summary>
    ''' キーが押し始められたかを取得
    ''' </summary>
    ''' <param name="key">押し始められたかどうかを取得するキー</param>
    ''' <returns>押し始められていたらTrue、押し始められていなければFalse</returns>
    Public Function IsPush(ByVal key As Keys) As Boolean
        Return keysState.ContainsKey(key) AndAlso Not keysState(key)(1) AndAlso keysState(key)(2)
    End Function

    ''' <summary>
    ''' キーが押されているか取得
    ''' </summary>
    ''' <param name="key">押されているかどうかを取得するキー</param>
    ''' <returns>押されていたらTrue、押されていなければFalse</returns>
    Public Function IsPress(ByVal key As Keys) As Boolean
        Return keysState(key)(0)
    End Function

    ''' <summary>
    ''' キーが離されたかを取得
    ''' </summary>
    ''' <param name="key">離されたかどうかを取得するキー</param>
    ''' <returns>離されたらTrue、離されていなければFalse</returns>
    Public Function IsUp(ByVal key As Keys) As Boolean
        Return keysState.ContainsKey(key) AndAlso keysState(key)(1) AndAlso Not keysState(key)(2)
    End Function

    ''' <summary>
    ''' 対象のコントロールのKeyDownイベントハンドラに追加する
    ''' </summary>
    Public Sub KeyDown(ByVal sender As Object, ByVal e As KeyEventArgs)
        If keysState.ContainsKey(e.KeyCode) Then
            keysState(e.KeyCode)(0) = True
        Else
            keysState.Add(e.KeyCode, New List(Of Boolean)(New Boolean() {True, False, False}))
        End If
    End Sub

    ''' <summary>
    ''' 対象のコントロールのKeyUpイベントハンドラに追加する
    ''' </summary>
    Public Sub KeyUp(ByVal sender As Object, ByVal e As KeyEventArgs)
        If keysState.ContainsKey(e.KeyCode) Then
            keysState(e.KeyCode)(0) = False
        Else
            keysState.Add(e.KeyCode, New List(Of Boolean)(New Boolean() {False, False, False}))
        End If
    End Sub
End Module

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください