Get the state of a key at any time
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 < 1) Then i = 15 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.