Article ID: 59132 - View products that this article applies to.
This article was previously published under Q59132
By setting up key traps for the NUM LOCK, CAPS LOCK, and SCROLL LOCK keys, a Basic program can prevent the toggling of each of these key states. This is extremely useful for trapping other keys because the program can limit the number of keys to be defined. The first example below demonstrates this type of functionality.
Another example listed below demonstrates how to programmatically (without pressing the key) force the CAPS LOCK state to ON or OFF. This same example can be used for the NUM LOCK and SCROLL LOCK keys.
The syntax of the KEY statement (where n=15 through 25 can be user-defined keys) is as follows:
The following are the scan codes are for the CAPS LOCK, NUM LOCK, and SCROLL LOCK keys:
By defining traps for NUM LOCK and CAPS LOCK, your program can effectively reduce (by a factor of four) the number of keys needed to be defined. For example, to trap both the CTRL+ALT+DEL and CTRL+BREAK keystroke combinations, 16 keys must be created to handle all the different keystroke combinations. This is more than the maximum number of user-defined keys (11). By defining CAPS and NUM LOCK traps, only 4 additional keys must be defined.
Key Scan Code --- --------- CAPS LOCK &H3A NUM LOCK &H45 SCROLL LOCK &H46
Code ExampleThe following code example disables the toggles for the CAPS LOCK, NUM LOCK, and SCROLL LOCK keys:
The code example below allows you to determine the state of the CAPS LOCK key with the following PEEK command:
If CAPS LOCK is off, the value of "X" will be "0". If CAPS LOCK is on, the value will be 64.
To force the CAPS LOCK off, use the following command:
To force the CAPS LOCK on, use the following:
Each bit of location 1047 reflects the status of a keyboard flag. This includes NUM LOCK, SCROLL LOCK, CAPS LOCK, INSert mode, and whether or not the LEFT SHIFT and RIGHT SHIFT keys, the ALT key, or the CTRL (Control) key is currently pressed or not. See the following table for more information:
Although the INS key is included in the table shown above, you cannot make use of it. In Visual Basic for MS-DOS, you cannot use either the POKE or the CALL INTERRUPT to set the Insert mode when you are in Forms mode. The only way to set the Insert mode is by pressing the INS key. This is by design in Visual Basic for MS-DOS.
Bit No. Decimal Value Keyboard Flag --------------------------------- 0 1 RIGHT SHIFT 1 2 LEFT SHIFT 2 4 CTRL (Control) 3 8 ALT 4 16 SCROLL LOCK 5 32 NUM LOCK 6 64 CAPS LOCK 7 128 INS (Insert mode)
To determine the state of any flag, the following statement will return "0" if the flag is clear (off or not pressed), and will return <bval> if the flag is set (on or pressed):
To force the flag on (this applies only to the LOCK keys -- not the INS key), you need to set the appropriate bit. You can do this with the following POKE statement:
PEEK(1047) AND <bval> (where <bval> is the decimal value of the bit that represents the flag you want)
To force the flag off, you can use the following similar statement:
POKE 1047, PEEK(1047) OR <bval> (where <bval> is the decimal value of the flag you want to set)
Note that simply poking the bit value into 1047 would effectively set the flag, but would also clear all other flags. Thus, be sure to retain the previous values of the other flags by using the above strategies.
POKE 1047, PEEK(1047) AND (255 - <bval>)
Note that instead of using PEEK, you may also get the status of keyboard flags with IBM ROM BIOS Interrupt 16h, using function number 2. This interrupt returns the ROM BIOS flags byte that describes the state of the following keyboard toggles and SHIFT keys: RIGHT SHIFT or LEFT SHIFT key down, CTRL key down, ALT key down, SCROLL LOCK on, NUM LOCK on, CAPS LOCK on, INSert on.
Article ID: 59132 - Last Review: August 16, 2005 - Revision: 2.1