home *** CD-ROM | disk | FTP | other *** search
/ HomeWare 14 / HOMEWARE14.bin / os2 / cenv2_19.arj / KEYSTATE.CMD < prev    next >
OS/2 REXX Batch file  |  1994-03-08  |  5KB  |  144 lines

  1. EXTPROC CENVI
  2. /**************************************************************************
  3.  *** KeyState.cmd - CEnvi sample file which will set, unset, or display ***
  4.  *** ver.1          the state of keyboard keys.                         ***
  5.  **************************************************************************/
  6.  
  7. #include <FileIO.lib>
  8. #include <DevIOCtl.lib>
  9.  
  10. #define  NUMLOCK_BIT    0x20
  11. #define  CAPSLOCK_BIT   0x40
  12. #define  INSERT_BIT     0x80
  13. #define  VK_NUMLOCK     0x1D
  14. #define  VK_CAPSLOCK    0x0E
  15. #define  VK_INSERT      0x1A
  16.  
  17. main(argc,argv)
  18. {
  19.    // check that the input is valid
  20.    if ( argc != 3
  21.      || ( argv[1][1] != 0  ||  !strchr("+?-",argv[1][0]) )
  22.      || ( strnicmp("CAP",argv[2],3)
  23.        && strnicmp("NUM",argv[2],3)
  24.        && strnicmp("INS",argv[2],3) ) ) {
  25.       Instructions()
  26.    } else {
  27.  
  28.       // determine whether to apply to CapsLock or NumLock
  29.       if ( !strnicmp("CAP",argv[2],3) )
  30.          KeyName = "CapsLock", KeyBit = CAPSLOCK_BIT, VKey = VK_CAPSLOCK;
  31.       else if ( !strnicmp("NUM",argv[2],3) )
  32.          KeyName = "NumLock",  KeyBit = NUMLOCK_BIT,  VKey = VK_NUMLOCK;
  33.       else
  34.          KeyName = "Insert",   KeyBit = INSERT_BIT,   VKey = VK_INSERT;
  35.  
  36.       // get current keyboard status
  37.       KeyTable = GetGlobalKeyboardTable();
  38.  
  39.       switch( argv[1][0] ) {
  40.          case '+':   // Set Key ON
  41.             DesiredState = TRUE;
  42.             break
  43.          case '-':   // Turn KEY OFF
  44.             DesiredState = FALSE;
  45.             break
  46.          case '?':   // desired state is whatever it currently is
  47.             DesiredState = KeyTable[VKey] & 1;
  48.             printf("%s is currently set %s.\n",KeyName,DesiredState ? "ON" : "OFF")
  49.             break;
  50.       }
  51.       // In case any values are out-of-sync, set them all now
  52.       SetLocalKeyboardStatus(KeyBit,DesiredState);
  53.       SetGlobalKeyboardTable(KeyTable,VKey,DesiredState);
  54.       return( DesiredState )
  55.    }
  56. }
  57.  
  58.  
  59. SetLocalKeyboardStatus(KeyBit,Set)  // set keyboard state from structure
  60. {                                   // elements .ShiftState and .NLS
  61.    // Open $Kbd device
  62.    rc = DosOpen("\\DEV\\KBD$",FileHandle,ActionTaken,0,0,
  63.                 OPEN_ACTION_OPEN_IF_EXISTS,
  64.                 OPEN_ACCESS_READONLY | OPEN_SHARE_DENYNONE,NULL);
  65.    assert( 0 == rc );
  66.  
  67.    // call DosDevIOCTL to get kbd state
  68.    #define KEYBOARD_CATEGORY     4
  69.    #define KBD_GETSHIFTSTATE     0x0073
  70.    #define GET_DATA_SIZE         3
  71.    rc = DosDevIOCtl(FileHandle,KEYBOARD_CATEGORY,KBD_GETSHIFTSTATE,
  72.                     NULL,0,0,Data,GET_DATA_SIZE,DataSize);
  73.    assert( 0 == rc );
  74.    ShiftState = BLObGet(Data,0,UWORD16);
  75.  
  76.    // call DosDevIOCTL to set kbd state
  77.    if ( Set )
  78.       ShiftState |= KeyBit;
  79.    else
  80.       ShiftState &= ~KeyBit;
  81.    #define KBD_SETSHIFTSTATE     0x0053
  82.    BLObPut(Data,0,ShiftState,UWORD16);
  83.    rc = DosDevIOCtl(FileHandle,KEYBOARD_CATEGORY,KBD_SETSHIFTSTATE,
  84.                     Data,DataSize,DataSize,NULL,0,0);
  85.    assert( 0 == rc );
  86.  
  87.  
  88.    // set LED's to show the state of the keyboard
  89.    #define KBD_SETLEDS  0x005A
  90.    leds = (ShiftState & 0x70) >> 4;
  91.    BLObPut(Data,0,leds,UWORD16);
  92.    DataSize = 2;
  93.    DynamicLink("doscalls",ORD_DOS32DEVIOCTL,BIT32,CDECL,
  94.                FileHandle,KEYBOARD_CATEGORY,KBD_SETLEDS,
  95.                Data,DataSize,DataSize,NULL,0,NULL);
  96.  
  97.    // close device
  98.    DosClose(FileHandle);
  99. }
  100.  
  101.  
  102. #define HWND_DESKTOP                     1
  103. #define ORD_WIN32SETKEYBOARDSTATETABLE   921
  104.  
  105. GetGlobalKeyboardTable()   // return 256-byte buffer for current keyboard
  106. {
  107.    table[255] = '\0';   // initialize 256-byte key table
  108.    DynamicLink("PMWIN",ORD_WIN32SETKEYBOARDSTATETABLE,BIT32,CDECL,
  109.                HWND_DESKTOP,table,FALSE);
  110.    return(table);
  111. }
  112.  
  113. SetGlobalKeyboardTable(KeyTable,VirtualKey,SetBool)
  114. {
  115.    if ( SetBool )
  116.       KeyTable[VirtualKey] |= 1;
  117.    else
  118.       KeyTable[VirtualKey] &= 0xFE;
  119.    DynamicLink("PMWIN",ORD_WIN32SETKEYBOARDSTATETABLE,BIT32,CDECL,
  120.                HWND_DESKTOP,KeyTable,TRUE);
  121. }
  122.  
  123. Instructions()
  124. {
  125.    printf("\a\n")
  126.    printf("KeyState - Set, Clear, or Show the keyboard state of NumLock or CapsLock\n");
  127.    printf("\n");
  128.    printf("SYNTAX: KeyState < + | - | ? > < CAP | NUM | INS >\n");
  129.    printf("\n");
  130.    printf("Where:  +    Set KeyState ON\n");
  131.    printf("        -    Set KeySTate OFF\n");
  132.    printf("        ?    Display current Key State, and return ERRORLEVEL 1 if set\n");
  133.    printf("             and ERRORLEVEL 0 if clear\n");
  134.    printf("        NUM  Apply command < + | - | ? > to the NumLock key\n");
  135.    printf("        CAP  Apply command < + | - | ? > to the CapsLock key\n");
  136.    printf("        INS  Apply command < + | - | ? > to the Insert key\n");
  137.    printf("\n");
  138.    printf("Examples: KeyState + Num      Turn on the Numlock key\n");
  139.    printf("          KeyState - Cap      Turn of the CapsLock key\n");
  140.    printf("          KeyState ? Num      Show state of NumLock, return ERRORLEVEL if set\n");
  141.    printf("\n")
  142. }
  143.  
  144.