If you're trying to create an interactive app, or a VB game, whether its in DirectX
or using GDI calls, then reading a key state asynchronously is considerably faster
than waiting for KeyUp, KeyDown or KeyPress event on a form. Checking the key state
this way can also be very useful when trying to check for shift states when responding to a
WM_KEYDOWN event if you are doing sub-classing.
I used this technique to speed up a DirectX sample at Visual Basic Area 51.
Because the original sample only updated the screen in response to form KeyDown events, the result was
400% quicker! (In fact, too quick - I had to put a slowdown in the loop to keep up!).
Create a new project, and add a Picture Box and a Command Button to the
form. Then paste the following code into the form:
Private m_bPlay As Boolean
Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Private Sub cmdPlay_Click()
Dim i As Long
Dim iLast As Long
    If cmdPlay.Caption = "&Stop" Then
        m_bPlay = False
        cmdPlay.Caption = "&Play"
    Else
        cmdPlay.Caption = "&Stop"
        m_bPlay = True
        i = 1
        Do
           
' Determine if the left or right keys are
           
' pressed:
            If (GetAsyncKeyState(vbKeyLeft)) Then
               
' Diminish the colour
                i = i - 1
            ElseIf (GetAsyncKeyState(vbKeyRight)) Then
               
' Increase the colour
                i = i + 1
            End If
           
           
' Colour within bounds:
            If (i
            If (i > 15) Then i = 1
           
           
' If colour has changed, change the display:
            If (iLast i) Then
                With Picture1
                    .Cls
                    .ForeColor = QBColor(i)
                   
' Generate a RGB complement for the background:
                    .BackColor = &HFFFFFF And (Not QBColor(i))
                    .CurrentX = 64 * Screen.TwipsPerPixelX
                    .CurrentY = 64 * Screen.TwipsPerPixelY
                   
                    Picture1.Print Hex$(QBColor(i))
                End With
            End If
            iLast = i
           
           
' This is here to stop the animation
           
' getting too fast to see:
            Sleep 25
           
' Ensure we can still click buttons etc
            DoEvents
           
        Loop While m_bPlay
           
    End If
   
End Sub
Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
    If (cmdPlay.Caption = "&Stop") Then
        cmdPlay_Click
    End If
End Sub
When you click on the command button, the code starts a DoEvents loop in which it
checks if the Right Key or Left Key are pressed. When one is pressed, it changes
the background and foreground colours of the Picture Box and displays the QBColor
code.