You are currently offline, waiting for your internet to reconnect

How to Disable Toggle for NUM/CAPS/SCROLL LOCK with Key Trap

This article was previously published under Q59132
Retired KB Content Disclaimer
This article was written about products for which Microsoft no longer offers support. Therefore, this article is offered "as is" and will no longer be updated.
By setting up key traps for the NUM LOCK, CAPS LOCK, and SCROLL LOCKkeys, a Basic program can prevent the toggling of each of these keystates. This is extremely useful for trapping other keys because theprogram can limit the number of keys to be defined. The firstexample 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 beuser-defined keys) is as follows:
   KEY n, CHR$(keyboardflag) + CHR$(scancode)				
The following are the scan codes are for the CAPS LOCK, NUM LOCK, andSCROLL LOCK keys:
   Key           Scan Code   ---           ---------   CAPS LOCK     &H3A   NUM LOCK      &H45   SCROLL LOCK   &H46				
By defining traps for NUM LOCK and CAPS LOCK, your program caneffectively reduce (by a factor of four) the number of keys needed tobe defined. For example, to trap both the CTRL+ALT+DEL and CTRL+BREAKkeystroke combinations, 16 keys must be created to handle all thedifferent keystroke combinations. This is more than the maximumnumber of user-defined keys (11). By defining CAPS and NUM LOCKtraps, only 4 additional keys must be defined.

Code Example

The following code example disables the toggles for the CAPS LOCK,NUM LOCK, and SCROLL LOCK keys:
' NOTE: This program assumes NUM LOCK and CAPS LOCK are off at the'       beginning. See the article referenced above for how to set'       the NUM and CAPS LOCK off.KEY 15, CHR$(&H0) + CHR$(&H3A)       ' CAPS LOCKON KEY(15) GOSUB capsKEY(15) ONKEY 16, CHR$(&H0) + CHR$(&H45)       ' NUM LOCKON KEY(16) GOSUB numKEY(16) ONKEY 17, CHR$(&H0) + CHR$(&H46)       ' SCROLL LOCKON KEY(17) GOSUB scrollKEY(17) ONWHILE INKEY$ <> CHR$(27): WENDENDcaps: PRINT "NO CAPS LOCK TOGGLE!"RETURNnum:  PRINT "NO NUM LOCK TOGGLE!"RETURNscroll:  PRINT "NO SCROLL LOCK TOGGLE!"RETURN				
The code example below allows you to determine the state of theCAPS LOCK key with the following PEEK command:
   DEF SEG = 0   X = PEEK(1047) AND 64				
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:
   DEF SEG = 0   POKE 1047, PEEK(1047) AND 191				
To force the CAPS LOCK on, use the following:
   DEF SEG = 0   POKE 1047, PEEK(1047) OR 64				
Each bit of location 1047 reflects the status of a keyboard flag. Thisincludes NUM LOCK, SCROLL LOCK, CAPS LOCK, INSert mode, and whether ornot the LEFT SHIFT and RIGHT SHIFT keys, the ALT key, or the CTRL(Control) key is currently pressed or not. See the following table formore information:
   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)				
Although the INS key is included in the table shown above, you cannot makeuse of it. In Visual Basic for MS-DOS, you cannot use either the POKE orthe CALL INTERRUPT to set the Insert mode when you are in Forms mode. Theonly way to set the Insert mode is by pressing the INS key. This is bydesign in Visual Basic for MS-DOS.

To determine the state of any flag, the following statement willreturn "0" if the flag is clear (off or not pressed), and will return<bval> if the flag is set (on or pressed):
   PEEK(1047) AND <bval>   (where <bval> is the decimal value of the bit that represents   the flag you want)				
To force the flag on (this applies only to the LOCK keys -- not the INSkey), you need to set the appropriate bit. You can do this with thefollowing POKE statement:
   POKE 1047, PEEK(1047) OR <bval>   (where <bval> is the decimal value of the flag you want to set)				
To force the flag off, you can use the following similar statement:
   POKE 1047, PEEK(1047) AND (255 - <bval>)				
Note that simply poking the bit value into 1047 would effectively setthe flag, but would also clear all other flags. Thus, be sure toretain the previous values of the other flags by using the abovestrategies.

Note that instead of using PEEK, you may also get the status ofkeyboard flags with IBM ROM BIOS Interrupt 16h, using functionnumber 2. This interrupt returns the ROM BIOS flags byte thatdescribes 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.
VBmsdos QuickBas BasicCom 1.00 4.00 4.00b 4.50 6.00 6.00b 7.00 SCROLLLOCK NUMLOCK CAPSLOCK

Article ID: 59132 - Last Review: 08/16/2005 21:25:05 - Revision: 2.1

  • Microsoft Visual Basic for MS-DOS
  • Microsoft QuickBasic 4.0
  • Microsoft QuickBASIC 4.0b
  • Microsoft QuickBasic 4.5 for MS-DOS
  • Microsoft BASIC Compiler 6.0
  • Microsoft BASIC Compiler 6.0b
  • Microsoft BASIC Professional Development System 7.0
  • KB59132