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

From GPWiki
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