December 5, 1995
This article explains how to control the state of any virtual key from within a Microsoft® Visual Basic® application.
From within a Microsoft® Visual Basic® application, you can control the state of any one of the 256 virtual keys on the keyboard. You do this by executing two Microsoft Windows® application programming interface (API) functions—GetKeyboardState and SetKeyboardState.
In the example program below, you switch the state of both the caps lock and num lock keys. To do this, you must first retrieve the state of these two toggle keys by calling the GetKeyboardState function. After calling this function, the KeyboardBuffer array that you have defined in the program contains the current state of every virtual key.
To isolate the caps lock and num lock keys, you must interrogate the bytes stored in the KeyboardBuffer array. The constants VK_CAPITAL and VK_NUMLOCK represent the caps lock and num lock keys, respectively. If the low-order bit in the byte representing the toggle key is 1, then the key is on. If the low-order bit is 0, the key is off.
You can use the Visual Basic logical AND operator to test the low-order bit for the toggle keys, as shown here:
If KeyboardBuffer(VK_CAPITAL) And 1 Then
KeyboardBuffer(VK_CAPITAL) = 0
Else
KeyboardBuffer(VK_CAPITAL) = 1
End If
In the code fragment above, you first test the state of the caps lock key. If the caps lock key is currently on (the low-order bit is 1), you reset the low-order bit to 0 to turn the key off. If the caps lock key is off (the low-order bit is 0), you reset the low-order bit to 1 to turn the key on.
When you want to reverse the state of the toggle keys (that is, turn the key on if it is not engaged or off if it is engaged), you use the SetKeyboardState function. This function modifies the state of any virtual key. The key you want to modify is again stored in the KeyboardBuffer array.
This program shows how to turn the toggle (caps lock and num lock) keys on and off.
Private Declare Sub GetKeyboardState Lib "user32" (lpKeyState As Any)
Private Declare Sub SetKeyboardState Lib "user32" (lpKeyState As Any)
Const VK_CAPITAL = &H14
Const VK_NUMLOCK = &H90
Private Sub Command1_Click()
ReDim KeyboardBuffer(256) As Byte
GetKeyboardState KeyboardBuffer(0)
If KeyboardBuffer(VK_CAPITAL) And 1 Then
KeyboardBuffer(VK_CAPITAL) = 0
Else
KeyboardBuffer(VK_CAPITAL) = 1
End If
If KeyboardBuffer(VK_NUMLOCK) And 1 Then
KeyboardBuffer(VK_NUMLOCK) = 0
Else
KeyboardBuffer(VK_NUMLOCK) = 1
End If
SetKeyboardState KeyboardBuffer(0)
End Sub
Run the example program by pressing f5. Notice that both the caps lock and num lock keys are off. Click the Command Button control. The caps lock and num lock keys are both on. Each time you click the Command Button control, the state of the caps lock and num lock keys is reversed.