home *** CD-ROM | disk | FTP | other *** search
/ POINT Software Programming / PPROG1.ISO / pascal / swag / keyboard.swg / 0015_Keyboard SCAN Keys.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1993-05-28  |  10.8 KB  |  233 lines

  1. {AM▒Hi everyone, I have a question. I need to know if there is some simple
  2. AM▒way to do the following. I want to pass as a parameter to a Procedure
  3. AM▒that will indicate what keypresses are valid. I am doing this already
  4. AM▒for regular keys, but I need to be able to list regular keys as well as
  5. AM▒extended key(mostly Function keys).
  6.  
  7. AM▒I do like so,
  8.  
  9. AM▒Command_Keys : Set of Char ['Q', 'A', 'K'];
  10. AM▒Is there a way to add extended keys to the above.
  11.  
  12. Declare extended scan codes, then format them into an Array:
  13. }
  14. Const
  15.  
  16. (* Function keys *)
  17.     F1 = $3B00;       ShF1 = $5400;      CtrlF1 = $5E00;      AltF1 = $6800;
  18.     F2 = $3C00;       ShF2 = $5500;      CtrlF2 = $5F00;      AltF2 = $6900;
  19.     F3 = $3D00;       ShF3 = $5600;      CtrlF3 = $6000;      AltF3 = $6A00;
  20.     F4 = $3E00;       ShF4 = $5700;      CtrlF4 = $6100;      AltF4 = $6B00;
  21.     F5 = $3F00;       ShF5 = $5800;      CtrlF5 = $6200;      AltF5 = $6C00;
  22.     F6 = $4000;       ShF6 = $5900;      CtrlF6 = $6300;      AltF6 = $6D00;
  23.     F7 = $4100;       ShF7 = $5A00;      CtrlF7 = $6400;      AltF7 = $6E00;
  24.     F8 = $4200;       ShF8 = $5B00;      CtrlF8 = $6500;      AltF8 = $6F00;
  25.     F9 = $4300;       ShF9 = $5C00;      CtrlF9 = $6600;      AltF9 = $7000;
  26.    F10 = $4400;      ShF10 = $5D00;     CtrlF10 = $6700;     AltF10 = $7100;
  27.    F11 = $8500;      ShF11 = $8700;     CtrlF11 = $8900;     AltF11 = $8B00;
  28.    F12 = $8600;      ShF12 = $8800;     CtrlF12 = $8A00;     AltF12 = $8C00;
  29.  
  30. (* Numeric keypad *)
  31.     Up = $4800;       ShUp = $4838;      CtrlUp = $8D00;      AltUp = $9800;
  32.   Down = $5000;     ShDown = $5032;    CtrlDown = $9100;    AltDown = $A000;
  33.   Left = $4B00;     ShLeft = $4B34;    CtrlLeft = $7300;    AltLeft = $9B00;
  34.  Right = $4D00;    ShRight = $4D36;   CtrlRight = $7400;   AltRight = $9D00;
  35.   Home = $4700;     ShHome = $4737;    CtrlHome = $7700;    AltHome = $9700;
  36. endKey = $4F00;      Shend = $4F31;     Ctrlend = $7500;     Altend = $9F00;
  37.   PgUp = $4900;     ShPgUp = $4939;    CtrlPgUp = $8400;    AltPgUp = $9900;
  38.   PgDn = $5100;     ShPgDn = $5133;    CtrlPgDn = $7600;    AltPgDn = $A100;
  39.    Ins = $5200;      ShIns = $5230;     CtrlIns = $9200;     AltIns = $A200;
  40.    Del = $5300;      ShDel = $532E;     CtrlDel = $9300;     AltDel = $A300;
  41.   Pad5 = $4C00;     ShPad5 = $4C35;    CtrlPad5 = $8F00;    AltPad5 = $9C00;
  42.  
  43. (* Alphabetic keys *)
  44.   LowA = $1E61;        UpA = $1E41;       CtrlA = $1E01;       AltA = $1E00;
  45.   LowB = $3062;        UpB = $3042;       CtrlB = $3002;       AltB = $3000;
  46.   LowC = $2E63;        UpC = $2E43;       CtrlC = $2E03;       AltC = $2E00;
  47.   LowD = $2064;        UpD = $2044;       CtrlD = $2004;       AltD = $2000;
  48.   LowE = $1265;        UpE = $1245;       CtrlE = $1205;       AltE = $1200;
  49.   LowF = $2166;        UpF = $2146;       CtrlF = $2106;       AltF = $2100;
  50.   LowG = $2267;        UpG = $2247;       CtrlG = $2207;       AltG = $2200;
  51.   LowH = $2368;        UpH = $2348;       CtrlH = $2308;       AltH = $2300;
  52.   LowI = $1769;        UpI = $1749;       CtrlI = $1709;       AltI = $1700;
  53.   LowJ = $246A;        UpJ = $244A;       CtrlJ = $240A;       AltJ = $2400;
  54.   LowK = $256B;        UpK = $254B;       CtrlK = $250B;       AltK = $2500;
  55.   LowL = $266C;        UpL = $264C;       CtrlL = $260C;       AltL = $2600;
  56.   LowM = $326D;        UpM = $324D;       CtrlM = $320D;       AltM = $3200;
  57.   LowN = $316E;        UpN = $314E;       CtrlN = $310E;       AltN = $3100;
  58.   LowO = $186F;        UpO = $184F;       CtrlO = $180F;       AltO = $1800;
  59.   LowP = $1970;        UpP = $1950;       CtrlP = $1910;       AltP = $1900;
  60.   LowQ = $1071;        UpQ = $1051;       CtrlQ = $1011;       AltQ = $1000;
  61.   LowR = $1372;        UpR = $1352;       CtrlR = $1312;       AltR = $1300;
  62.   LowS = $1F73;        UpS = $1F53;       CtrlS = $1F13;       AltS = $1F00;
  63.   LowT = $1474;        UpT = $1454;       CtrlT = $1414;       AltT = $1400;
  64.   LowU = $1675;        UpU = $1655;       CtrlU = $1615;       AltU = $1600;
  65.   LowV = $2F76;        UpV = $2F56;       CtrlV = $2F16;       AltV = $2F00;
  66.   LowW = $1177;        UpW = $1157;       CtrlW = $1117;       AltW = $1100;
  67.   LowX = $2D78;        UpX = $2D58;       CtrlX = $2D18;       AltX = $2D00;
  68.   LowY = $1579;        UpY = $1559;       CtrlY = $1519;       AltY = $1500;
  69.   LowZ = $2C7A;        UpZ = $2C5A;       CtrlZ = $2C1A;       AltZ = $2C00;
  70.  
  71. (* Number keys, on top row of keyboard *)
  72.   Num1 = $0231;                                                Alt1 = $7800;
  73.   Num2 = $0332;                           Ctrl2 = $0300;       Alt2 = $7900;
  74.   Num3 = $0433;                                                Alt3 = $7A00;
  75.   Num4 = $0534;                                                Alt4 = $7B00;
  76.   Num5 = $0635;                                                Alt5 = $7C00;
  77.   Num6 = $0736;                           Ctrl6 = $071E;       Alt6 = $7D00;
  78.   Num7 = $0837;                                                Alt7 = $7E00;
  79.   Num8 = $0938;                                                Alt8 = $7F00;
  80.   Num9 = $0A39;                                                Alt9 = $8000;
  81.   Num0 = $0B30;                                                Alt0 = $8100;
  82.  
  83. (* Miscellaneous *)
  84.    Space = $3920;
  85.     BkSp = $0E08;                   CtrlBkSp = $0E7F;       AltBkSp = $0E00;
  86.      Tab = $0F09;   ShTab = $0F00;  CtrlTab  = $9400;        AltTab = $A500;
  87.    Enter = $1C0D;                   CtrlEnter= $1C0A;      AltEnter = $1C00;
  88.      Esc = $011B;                                            AltEsc = $0100;
  89.  
  90.    Minus = $0C2D;                  CtrlMinus = $0C1F;      AltMinus = $8200;
  91.                      Plus = $0D2B;                          AltPlus = $8300;
  92. PadMinus = $4A2D;               CtrlPadMinus = $8E00;    AltPadMinus= $4A00;
  93.  PadPlus = $4E2B;                CtrlPadPlus = $9000;    AltPadPlus = $4E00;
  94.                      Star = $092A;
  95.  PadStar = $372A;                                        AltPadStar = $3700;
  96.  
  97. {AM>I do like so,
  98. AM>Command_Keys : Set of Char ['Q', 'A', 'K'];
  99.   >Is there a way to add extended keys to the above.
  100.  
  101.   Hi Andrew!
  102.   One painless way is to set the high bit For Function keys.
  103. }
  104. Uses Crt;
  105. Const
  106.   Home   = #199;      UArr  = #200;     PgUp  = #201;
  107.   LArr   = #203;      Five  = #204;     RArr  = #205;
  108.   endkey = #207;      DArr  = #208;     PgDn  = #209;
  109.   Ins   = #210;       Del   = #211;
  110.  
  111.   CtrlHome = #247;    CtrlUP   = #141;    CtrlPgUp = #138;
  112.   CtrlLArr = #243;    CtrlFive = #143;    CtrlRArr = #244;
  113.   Ctrlend  = #245;    CtrlDown = #145;    CtrlPgDn = #246;
  114.   CtrlIns  = #146;    CtrlDel  = #147;
  115.  
  116.   BackSp  = #8;
  117.   Tab     = #9;       STab    = #143;
  118.   Enter   = #13;
  119.   Esc     = #27;
  120.  
  121.   CtrlPrtsc = #242;
  122.  
  123.   CtrlA  = #1;     AltA  = #158;        Alt1 = #248;
  124.   CtrlB  = #2;     AltB  = #176;        Alt2 = #249;
  125.   CtrlC  = #3;     AltC  = #174;        Alt3 = #250;
  126.   CtrlD  = #4;     AltD  = #160;        Alt4 = #251;
  127.   CtrlE  = #5;     AltE  = #146;        Alt5 = #252;
  128.   CtrlF  = #6;     AltF  = #161;        Alt6 = #253;
  129.   CtrlG  = #7;     AltG  = #162;        Alt7 = #254;
  130.   CtrlH  = #8;     AltH  = #163;        Alt8 = #255;
  131.   CtrlI  = #9;     AltI  = #151;        Alt9 = #134;
  132.   CtrlJ  = #10;    AltJ  = #164;        Alt0 = #135;
  133.   CtrlK  = #11;    AltK  = #165;        Altminus  = #136;
  134.   CtrlL  = #12;    AltL  = #166;        Altequals = #137;
  135.   CtrlM  = #13;    AltM  = #178;
  136.   CtrlN  = #14;    AltN  = #177;
  137.   CtrlO  = #15;    AltO  = #152;
  138.   CtrlP  = #16;    AltP  = #153;
  139.   CtrlQ  = #17;    AltQ  = #144;
  140.   CtrlR  = #18;    AltR  = #147;
  141.   CtrlS  = #19;    AltS  = #159;
  142.   CtrlT  = #20;    AltT  = #148;
  143.   CtrlU  = #21;    AltU  = #150;
  144.   CtrlV  = #22;    AltV  = #175;
  145.   CtrlW  = #23;    AltW  = #145;
  146.   CtrlX  = #24;    AltX  = #173;
  147.   CtrlY  = #25;    AltY  = #149;
  148.   CtrlZ  = #26;    AltZ  = #172;
  149.  
  150.   F1  = #187;      sF1  = #212;      CtrlF1  = #222;      AltF1  = #232;
  151.   F2  = #188;      sF2  = #213;      CtrlF2  = #223;      AltF2  = #233;
  152.   F3  = #189;      sF3  = #214;      CtrlF3  = #224;      AltF3  = #234;
  153.   F4  = #190;      sF4  = #215;      CtrlF4  = #225;      AltF4  = #235;
  154.   F5  = #191;      sF5  = #216;      CtrlF5  = #226;      AltF5  = #236;
  155.   F6  = #192;      sF6  = #217;      CtrlF6  = #227;      AltF6  = #237;
  156.   F7  = #193;      sF7  = #218;      CtrlF7  = #228;      AltF7  = #238;
  157.   F8  = #194;      sF8  = #219;      CtrlF8  = #229;      AltF8  = #239;
  158.   F9  = #195;      sF9  = #220;      CtrlF9  = #230;      AltF9  = #240;
  159.   F10 = #196;      sF10 = #221;      CtrlF10 = #231;      AltF10 = #241;
  160.   F11 = #139;      sF11 = #141;      CtrlF11 = #154;      AltF11 = #156;
  161.   F12 = #140;      sF12 = #142;      CtrlF12 = #155;      AltF12 = #157;
  162.  
  163.   Key  : Char = #0;
  164.  
  165. Var
  166.   NextOn        : ^Word Absolute $0040:$001A;    {keyboard buffer}
  167.   NextOff       : ^Word Absolute $0040:$001C;    {keyboard buffer}
  168.   KeyStatusBits : Word    Absolute $0040:$0017;  {keyboard buffer}
  169.   KeyStatus : Record
  170.      RShift, LShift,
  171.      RCtrl,  LCtrl,
  172.      RAlt,   LAlt,
  173.      Caps,   CapsON,
  174.      Ins,    InsON,
  175.      Scroll, ScrlON,
  176.      Num,    NumON          : Boolean;
  177.   end;
  178.  
  179. Procedure GetKeyStatus;   { Changes KeyStatus Variable }
  180. Const Old : Word = 0;
  181. begin
  182.   Old := KeyStatusBits;
  183.   FillChar(KeyStatus,SizeOf(KeyStatus),0);
  184.   With KeyStatus do
  185.   begin
  186.    RShift := ((Old Shr 0 ) and 1) = 1;
  187.    LShift := ((Old Shr 1 ) and 1) = 1;
  188.    RCtrl  := ((Old Shr 2 ) and 1) = 1;  { Test For either CTRL Key }
  189.    RAlt   := ((Old Shr 3 ) and 1) = 1;  { Test For either Alt Key }
  190.    ScrlON := ((Old Shr 4 ) and 1) = 1;  { Is Scroll Lock light on }
  191.    NumON  := ((Old Shr 5 ) and 1) = 1;  { Is Num Lock light on }
  192.    CapsON := ((Old Shr 6 ) and 1) = 1;  { Is Caps Lock light on }
  193.    InsON  := ((Old Shr 7 ) and 1) = 1;  { Is Insert State on }
  194.    LCtrl  := ((Old Shr 8 ) and 1) = 1;  { This also sets bit 3 }
  195.    LAlt   := ((Old Shr 9 ) and 1) = 1;  { This also sets bit 4 }
  196.    Scroll := ((Old Shr 12) and 1) = 1;  { This toggles bit 5 }
  197.    Num    := ((Old Shr 13) and 1) = 1;  { This toggles bit 6 }
  198.    Caps   := ((Old Shr 14) and 1) = 1;  { This toggles bit 7 }
  199.    Ins    := ((Old Shr 15) and 1) = 1;  { This toggles bit 8 }
  200.   end;
  201. end; { }
  202.  
  203. Function GetKey : Char;
  204. begin
  205.   If KeyPressed then         { Test For BIOS key pressed }
  206.    begin
  207.      Key := ReadKey;          { Basic BIOS Keyboard Entry }
  208.      if Key = #0 then
  209.      begin
  210.        Key := ReadKey;
  211.        Inc(Key,128);          { Make Expanded key codes one Byte }
  212.      end; { }
  213.    end else Key := #0;
  214.    GetKey := Key;
  215. end; { }
  216.  
  217. Procedure FlushBuffer;
  218. begin
  219.   Move(NextOn,NextOff,SizeOf(NextOn));
  220. end; { }
  221.  
  222. Var test : Char ;
  223. begin
  224.   ClrScr;
  225.   WriteLN('Press Both Shift Keys to end');
  226.   Repeat
  227.     GetKeyStatus;
  228.     Test := GetKey;
  229.     if Test <> #0 Then Write(Test);
  230.  
  231.   Until (KeyStatus.RShift and KeyStatus.LShift);
  232. end.
  233.