DirectX:DirectInput:Tutorials:VB:DX7:Keyboard Handling

From GDWiki

Jump to: navigation, search

DirectInput is the component of DirectX that gives you direct access to the current state of the keyboard (among other devices). This is obviously quite useful for game programming purposes and so I will outline its use here.

Dim dx As New DirectX7
Dim di As DirectInput
Dim diDEV As DirectInputDevice
 
    Set di = dx.DirectInputCreate()
    Set diDEV = di.CreateDevice("GUID_SysKeyboard")
 
    diDEV.SetCommonDataFormat DIFORMAT_KEYBOARD
    diDEV.SetCooperativeLevel Me.hWnd, DISCL_BACKGROUND Or DISCL_NONEXCLUSIVE
    diDEV.Acquire

As with DirectDraw, we have to create an instance of the DirectX7 object and use it to define a DirectInput object, di. We then need to set the direct input device to the one in which we are interested, in this case the keyboard. So, we call the di.CreateDevice method and request it returns the system keyboard object.

Next we have to set the data format of the device to the keyboard data format. We do this with the diDEV.SetCommonDataFormat. We could also use this to set the data format to Joy1, Joy2, or the mouse.

Just like DirectDraw, we must set the cooperative level. We pass the handle to the window for which we would like to receive keyboard input, if this is the form in which the code resides we can pass Me.hWnd. DISCL_BACKGROUND and DISCL_NONEXCLUSIVE allows other programs access to keystrokes, and give us access to all keystrokes.

Now that we've set up the device which we'd like to use, we have to acquire it using the diDEV.Acquire method.

Dim diState As DIKEYBOARDSTATE
Dim i As Integer
Public aKeys(211) As Boolean
 
    diDEV.GetDeviceStateKeyboard diState
 
    For i = 1 To 211
        If diState.Key(i) <> 0 Then
            aKeys(i) = True
        Else
            aKeys(i) = False
        End If
    Next

Everything is setup, now we can reap what we have sown (no, I'm not suggesting you go plant your keyboard in your garden in order to cultivate input). diState is an object that will contain the states of all the keys on the keyboard, and we can tap into this using an array and a loop. Each key on the keyboard corresponds to an integer value between 0 and 211. If we then make an array with 212 members we can keep track of which keys are active and when. Use the diDEV.GetDeviceStateKeyboard method to fill the diState variable, and then extract the data from this into our array aKeys using a for loop.

Click here for sample source code demonstrating DirectInput keyboard handling in action.


This may be useful:

Private Function KeyName(Key As Byte) As String
   Select Case Key
   Case DIK_ESCAPE
      KeyName = "ESCAPE"
   Case DIK_1
      KeyName = "1"
   Case DIK_2
      KeyName = "2"
   Case DIK_3
      KeyName = "3"
   Case DIK_4
      KeyName = "4"
   Case DIK_5
      KeyName = "5"
   Case DIK_6
      KeyName = "6"
   Case DIK_7
      KeyName = "7"
   Case DIK_8
      KeyName = "8"
   Case DIK_9
      KeyName = "9"
   Case DIK_0
      KeyName = "0"
   Case DIK_MINUS
      KeyName = "-"
   Case DIK_EQUALS
      KeyName = "="
   Case DIK_BACK
      KeyName = "BACKSPACE"
   Case DIK_TAB
      KeyName = "TAB"
   Case DIK_Q
      KeyName = "Q"
   Case DIK_W
      KeyName = "W"
   Case DIK_E
      KeyName = "E"
   Case DIK_R
      KeyName = "R"
   Case DIK_T
      KeyName = "T"
   Case DIK_Y
      KeyName = "Y"
   Case DIK_U
      KeyName = "U"
   Case DIK_I
      KeyName = "I"
   Case DIK_O
      KeyName = "O"
   Case DIK_P
      KeyName = "P"
   Case DIK_LBRACKET
      KeyName = "["
   Case DIK_RBRACKET
      KeyName = "]"
   Case DIK_RETURN
      KeyName = "RETURN"
   Case DIK_LCONTROL
      KeyName = "LEFT CONTROL"
   Case DIK_A
      KeyName = "A"
   Case DIK_S
      KeyName = "S"
   Case DIK_D
      KeyName = "D"
   Case DIK_F
      KeyName = "F"
   Case DIK_G
      KeyName = "G"
   Case DIK_H
      KeyName = "H"
   Case DIK_J
      KeyName = "J"
   Case DIK_K
      KeyName = "K"
   Case DIK_L
      KeyName = "L"
   Case DIK_SEMICOLON
      KeyName = ";"
   Case DIK_APOSTROPHE
      KeyName = "'"
   Case DIK_GRAVE
      KeyName = "`"
   Case DIK_LSHIFT
      KeyName = "LEFT SHIFT"
   Case DIK_BACKSLASH
      KeyName = "\"
   Case DIK_Z
      KeyName = "Z"
   Case DIK_X
      KeyName = "X"
   Case DIK_C
      KeyName = "C"
   Case DIK_V
      KeyName = "V"
   Case DIK_B
      KeyName = "B"
   Case DIK_N
      KeyName = "N"
   Case DIK_M
      KeyName = "M"
   Case DIK_COMMA
      KeyName = ","
   Case DIK_PERIOD
      KeyName = "."
   Case DIK_SLASH
      KeyName = "/"
   Case DIK_RSHIFT
      KeyName = "RIGHT SHIFT"
   Case DIK_MULTIPLY
      KeyName = "NUMPAD MULTIPLY"
   Case DIK_LMENU
      KeyName = "LEFT ALT"
   Case DIK_SPACE
      KeyName = "SPACE"
   Case DIK_CAPITAL
      KeyName = "CAPS LOCK"
   Case DIK_F1
      KeyName = "F1"
   Case DIK_F2
      KeyName = "F2"
   Case DIK_F3
      KeyName = "F3"
   Case DIK_F4
      KeyName = "F4"
   Case DIK_F5
      KeyName = "F5"
   Case DIK_F6
      KeyName = "F6"
   Case DIK_F7
      KeyName = "F7"
   Case DIK_F8
      KeyName = "F8"
   Case DIK_F9
      KeyName = "F9"
   Case DIK_F10
      KeyName = "F10"
   Case DIK_NUMLOCK
      KeyName = "NUM LOCK"
   Case DIK_SCROLL
      KeyName = "SCROLL LOCK"
   Case DIK_NUMPAD7
      KeyName = "NUMPAD 7"
   Case DIK_NUMPAD8
      KeyName = "NUMPAD 8"
   Case DIK_NUMPAD9
      KeyName = "NUMPAD 9"
   Case DIK_SUBTRACT
      KeyName = "NUMPAD SUBTRACT"
   Case DIK_NUMPAD4
      KeyName = "NUMPAD 4"
   Case DIK_NUMPAD5
      KeyName = "NUMPAD 5"
   Case DIK_NUMPAD6
      KeyName = "NUMPAD 6"
   Case DIK_ADD
      KeyName = "NUMPAD ADD"
   Case DIK_NUMPAD1
      KeyName = "NUMPAD 1"
   Case DIK_NUMPAD2
      KeyName = "NUMPAD 2"
   Case DIK_NUMPAD3
      KeyName = "NUMPAD 3"
   Case DIK_NUMPAD0
      KeyName = "NUMPAD 0"
   Case DIK_DECIMAL
      KeyName = "NUMPAD DECIMAL"
   Case DIK_F11
      KeyName = "F11"
   Case DIK_F12
      KeyName = "F12"
   Case DIK_F13
      KeyName = "F13"
   Case DIK_F14
      KeyName = "F14"
   Case DIK_F15
      KeyName = "F15"
   Case DIK_NUMPADENTER
      KeyName = "NUMPAD ENTER"
   Case DIK_RCONTROL
      KeyName = "RIGHT CONTROL"
   Case DIK_NUMPADCOMMA
      KeyName = "NUMPAD ,"
   Case DIK_DIVIDE
      KeyName = "/"
   Case DIK_SYSRQ
      KeyName = "PRINT SCREEN"
   Case DIK_RMENU
      KeyName = "RIGHT ALT"
   Case DIK_HOME
      KeyName = "HOME"
   Case DIK_UP
      KeyName = "UP"
   Case DIK_PRIOR
      KeyName = "PAGE UP"
   Case DIK_LEFT
      KeyName = "LEFT"
   Case DIK_RIGHT
      KeyName = "RIGHT"
   Case DIK_END
      KeyName = "END"
   Case DIK_DOWN
      KeyName = "DOWN"
   Case DIK_NEXT
      KeyName = "PAGE DOWN"
   Case DIK_INSERT
      KeyName = "INSERT"
   Case DIK_DELETE
      KeyName = "DELETE"
   Case DIK_LWIN
      KeyName = "LEFT WINDOWS"
   Case DIK_RWIN
      KeyName = "RIGHT WINDOWS"
   Case DIK_APPS
      KeyName = "APPLICATION"
   Case DIK_PAUSE
      KeyName = "PAUSE"
   End Select
End Function
Personal tools
Categories