home *** CD-ROM | disk | FTP | other *** search
/ Programmer 7500 / MAX_PROGRAMMERS.iso / PROGRAMS / UTILS / TECLADO / TCKEY.ZIP / KEYDEMO.C next >
Encoding:
C/C++ Source or Header  |  1990-06-08  |  6.3 KB  |  230 lines

  1. /* keydemo.c
  2.  * Taken from 'The compleat keyboard: Retrieving Scan codes and extended
  3.  * keys' by Richard Hale Shaw as published in 'Inside Turbo C', Special
  4.  * Issue, The Cobb Group.
  5.  * Demonstrate use of keyboard routines in TCKEY.C
  6. */
  7.  
  8. #include      <conio.h>
  9. #include      <stdio.h>
  10. #include      <dos.h>
  11. #include      <ctype.h>
  12. #include      "tckey.h"
  13.  
  14. #define CURSOR_OFF      0
  15. #define CURSOR_ON       1
  16. #define MSGCOL          10
  17. #define VCOL            34
  18. #define CROW            3
  19.  
  20. /* display control */
  21. #define RIGHTSHIFTROW   6
  22. #define LEFTSHIFTROW         (RIGHTSHIFTROW+1)
  23. #define CTRLKEYROW              (RIGHTSHIFTROW+2)
  24. #define ALTKEYROW           (RIGHTSHIFTROW+3)
  25. #define SCROLLLOCKTOGGLEROW        (RIGHTSHIFTROW+4)
  26. #define NUMTOGGLEROW         (RIGHTSHIFTROW+5)
  27. #define CAPSTOGGLEROW         (RIGHTSHIFTROW+6)
  28. #define INSERTTOGGLEROW         (RIGHTSHIFTROW+7)
  29.  
  30. /* Enhanced Keyboard Message positions: */
  31. #define LEFTCTRLKEYROW         (RIGHTSHIFTROW+8)
  32. #define LEFTALTKEYROW           (RIGHTSHIFTROW+9)
  33. #define RIGHTCTRLKEYROW         (RIGHTSHIFTROW+10)
  34. #define RIGHTALTKEYROW           (RIGHTSHIFTROW+11)
  35. #define SCROLLLOCKROW         (RIGHTSHIFTROW+12)
  36. #define NUMLOCKROW          (RIGHTSHIFTROW+13)
  37. #define CAPSLOCKROW         (RIGHTSHIFTROW+14)
  38. #define SYSREQROW           (RIGHTSHIFTROW+15)
  39.  
  40.  
  41. void main(int argc, char **argv);
  42. void cdecl atsay(unsigned row, unsigned col, char *fmt, ...);
  43. void Cursor(int on_off);
  44.  
  45. void main(int argc, char **argv)
  46.     {
  47.     unsigned c, flags, enhancedkbd = FALSE;
  48.     char *dn = "DOWN", *up = "UP  ",*on = "ON ", *off = "OFF";
  49.      if(argc > 1)                /* check for -E option */
  50.         {
  51.         argv++;
  52.         if (((**argv) == '-') && (toupper(argv[0][1]) == 'E'))
  53.             {
  54.             enhancedkbd = TRUE;
  55.             KbdEnhanced(TRUE);
  56.             }
  57.         }
  58.  
  59. clrscr();                       /* clear the screen */
  60. Cursor(CURSOR_OFF);                /* turn off the cursor */
  61. atsay(0, MSGCOL,"Press 'END' at any time to terminate "
  62.      "Program.");
  63. atsay(2, MSGCOL,"    KbdCharIn returned:");
  64. atsay(CROW,MSGCOL, "   Printable key value:");
  65. atsay(4,MSGCOL, "Scan code for this key:");
  66.  
  67. atsay(RIGHTSHIFTROW,MSGCOL,       "    Right Shift Key is:");
  68. atsay(LEFTSHIFTROW,MSGCOL,        "     Left Shift Key is:");
  69. atsay(CTRLKEYROW,MSGCOL,          "    either Ctrl Key is:");
  70. atsay(ALTKEYROW,MSGCOL,           "     either Alt Key is:");
  71. atsay(SCROLLLOCKTOGGLEROW,MSGCOL, " Scroll Lock Toggle is:");
  72. atsay(NUMTOGGLEROW,MSGCOL,        "    Num Lock Toggle is:");
  73. atsay(CAPSTOGGLEROW,MSGCOL,       "   Caps Lock Toggle is:");
  74. atsay(INSERTTOGGLEROW,MSGCOL,     "      Insert Toggle is:");
  75.  
  76. if(enhancedkbd)                    /* if enhanced keyboard */
  77.     {
  78. atsay(LEFTCTRLKEYROW,MSGCOL,      "      Left Ctrl Key is:");
  79. atsay(LEFTALTKEYROW,MSGCOL,       "       Left Alt Key is:");
  80. atsay(RIGHTCTRLKEYROW,MSGCOL,     "     Right Ctrl Key is:");
  81. atsay(RIGHTALTKEYROW,MSGCOL,      "      Right Alt Key is:");
  82. atsay(SCROLLLOCKROW,MSGCOL,       "    Scroll Lock Key is:");
  83. atsay(NUMLOCKROW,MSGCOL,          "       Num Lock Key is:");
  84. atsay(CAPSLOCKROW,MSGCOL,         "      Caps Lock Key is:");
  85. atsay(INSERTTOGGLEROW,MSGCOL,     "      Insert Toggle is:");
  86.     }
  87. while(TRUE)
  88.     {                  /* wait for key, get char, flags */
  89.     KbdCharIn(&c, &flags, TRUE);
  90.     atsay(2,VCOL,"%05u (0x%04x)",c,c);
  91.     atsay(CROW,VCOL,"%c       (0x%02x)",
  92.         (KbdChar(c) ? KbdChar(c) : ' '), KbdChar(c));
  93.     atsay(4,VCOL,"%3d     (0x%02x)", KbdNoScan(c), KbdNoScan(c));
  94.  
  95.     atsay(RIGHTSHIFTROW,VCOL,"%s",(RightShift(flags) ? dn : up));
  96.     atsay(LEFTSHIFTROW,VCOL,"%s",(LeftShift(flags) ? dn : up));
  97.     atsay(CTRLKEYROW,VCOL,"%s",(CtrlKey(flags) ? dn : up));
  98.     atsay(ALTKEYROW,VCOL,"%s",(AltKey(flags) ? dn : up));
  99.     atsay(SCROLLLOCKTOGGLEROW,VCOL,"%s",(ScrollLockToggle(flags)
  100.         ? on : off));
  101.     atsay(NUMTOGGLEROW,VCOL,"%s",(NumLockToggle(flags)
  102.         ? on : off));
  103.     atsay(CAPSTOGGLEROW,VCOL,"%s",(CapsLockToggle(flags)
  104.         ? on : off));
  105.     atsay(INSERTTOGGLEROW,VCOL,"%s",(InsertToggle(flags)
  106.         ? on : off));
  107.  
  108.     if (enhancedkbd)
  109.         {
  110.         atsay(LEFTCTRLKEYROW,VCOL,"%s",(LeftCtrlKey(flags)
  111.              ? dn : up));
  112.         atsay(LEFTALTKEYROW,VCOL,"%s",(LeftAltKey(flags)
  113.              ? dn : up));
  114.         atsay(RIGHTCTRLKEYROW,VCOL,"%s",(RightCtrlKey(flags)
  115.              ? dn : up));
  116.         atsay(RIGHTALTKEYROW,VCOL,"%s",(RightAltKey(flags)
  117.              ? dn : up));
  118.         atsay(SCROLLLOCKROW,VCOL,"%s",(Scroll(flags)
  119.              ? dn : up));
  120.         atsay(NUMLOCKROW,VCOL,"%s",(NumLock(flags)
  121.              ? dn : up));
  122.         atsay(CAPSLOCKROW,VCOL,"%s",(CapsLock(flags)
  123.              ? dn : up));
  124.         }
  125.  
  126.     switch(KbdScan(c))
  127.         {
  128.         case HOME:
  129.             atsay(CROW,VCOL,"Home ");
  130.             break;
  131.         case END:
  132.             atsay(CROW,VCOL,"End  ");
  133.             break;
  134.         case PGUP:
  135.             atsay(CROW,VCOL,"PgUp ");
  136.             break;
  137.         case PGDN:
  138.             atsay(CROW,VCOL,"PgDn ");
  139.             break;
  140.         case UPARROW:
  141.             atsay(CROW,VCOL,"Up   ");
  142.             break;
  143.         case DOWNARROW:
  144.             atsay(CROW,VCOL,"Down ");
  145.             break;
  146.         case LEFTARROW:
  147.             atsay(CROW,VCOL,"Left ");
  148.             break;
  149.         case RIGHTARROW:
  150.             atsay(CROW,VCOL,"Right");
  151.             break;
  152.         case F1:
  153.             atsay(CROW,VCOL,"F1   ");
  154.             break;
  155.         case F2:
  156.             atsay(CROW,VCOL,"F2   ");
  157.             break;
  158.         case F3:
  159.             atsay(CROW,VCOL,"F3   ");
  160.             break;
  161.         case F4:
  162.             atsay(CROW,VCOL,"F4   ");
  163.             break;
  164.         case F5:
  165.             atsay(CROW,VCOL,"F5   ");
  166.             break;
  167.         case F6:
  168.             atsay(CROW,VCOL,"F6   ");
  169.             break;
  170.         case F7:
  171.             atsay(CROW,VCOL,"F7   ");
  172.             break;
  173.         case F8:
  174.             atsay(CROW,VCOL,"F8   ");
  175.             break;
  176.         case F9:
  177.             atsay(CROW,VCOL,"F9   ");
  178.             break;
  179.         case F10:
  180.             atsay(CROW,VCOL,"F10  ");
  181.             break;
  182.         case F11:
  183.             atsay(CROW,VCOL,"F11  ");
  184.             break;
  185.         case F12:
  186.             atsay(CROW,VCOL,"F12  ");
  187.             break;
  188.         }
  189.     if(c == END)
  190.         break;
  191.     }
  192. Cursor(CURSOR_ON);                      /* turn on cursor */
  193. clrscr();                        /* clear the screen */
  194. }
  195.                   /* printf with row/column positioning */
  196. void cdecl atsay(unsigned row, unsigned col, char *fmt, ...)
  197.     {
  198.     char workbuffer[250];
  199.     va_list argptr;
  200.     gotoxy(col+1, row+1);                 /* position cursor */
  201.     va_start(argptr, fmt);
  202.     vsprintf(workbuffer, fmt, argptr);
  203.     va_end(arg_ptr);
  204.     puts(workbuffer);
  205.     }
  206.  
  207.                          /* save and restore cursor */
  208. #define VIDEOINT      0X10
  209. void Cursor(int on_off)
  210.     {
  211.     static unsigned old_cursor = 0;
  212.     if(on_off == CURSOR_OFF)
  213.         {
  214.         _AH = 3;                /* get cursor info */
  215.         geninterrupt(VIDEOINT);
  216.         old_cursor = _CX;
  217.         _CH = 0x20;
  218.         _AH = 1;                /* turn off cursor */
  219.         geninterrupt(VIDEOINT);
  220.         }
  221.     else
  222.         {
  223.         _AH = 1;                 /* restore cursor */
  224.         _CX = old_cursor;
  225.         geninterrupt(VIDEOINT);
  226.         }
  227.     }
  228.  
  229.  
  230.