[Back to KEYBOARD SWAG index]  [Back to Main SWAG index]  [Original]

{AM±Hi everyone, I have a question. I need to know if there is some simple
AM±way to do the following. I want to pass as a parameter to a Procedure
AM±that will indicate what keypresses are valid. I am doing this already
AM±for regular keys, but I need to be able to list regular keys as well as
AM±extended key(mostly Function keys).

AM±I do like so,

AM±Command_Keys : Set of Char ['Q', 'A', 'K'];
AM±Is there a way to add extended keys to the above.

Declare extended scan codes, then format them into an Array:
}
Const

(* Function keys *)
    F1 = $3B00;       ShF1 = $5400;      CtrlF1 = $5E00;      AltF1 = $6800;
    F2 = $3C00;       ShF2 = $5500;      CtrlF2 = $5F00;      AltF2 = $6900;
    F3 = $3D00;       ShF3 = $5600;      CtrlF3 = $6000;      AltF3 = $6A00;
    F4 = $3E00;       ShF4 = $5700;      CtrlF4 = $6100;      AltF4 = $6B00;
    F5 = $3F00;       ShF5 = $5800;      CtrlF5 = $6200;      AltF5 = $6C00;
    F6 = $4000;       ShF6 = $5900;      CtrlF6 = $6300;      AltF6 = $6D00;
    F7 = $4100;       ShF7 = $5A00;      CtrlF7 = $6400;      AltF7 = $6E00;
    F8 = $4200;       ShF8 = $5B00;      CtrlF8 = $6500;      AltF8 = $6F00;
    F9 = $4300;       ShF9 = $5C00;      CtrlF9 = $6600;      AltF9 = $7000;
   F10 = $4400;      ShF10 = $5D00;     CtrlF10 = $6700;     AltF10 = $7100;
   F11 = $8500;      ShF11 = $8700;     CtrlF11 = $8900;     AltF11 = $8B00;
   F12 = $8600;      ShF12 = $8800;     CtrlF12 = $8A00;     AltF12 = $8C00;

(* Numeric keypad *)
    Up = $4800;       ShUp = $4838;      CtrlUp = $8D00;      AltUp = $9800;
  Down = $5000;     ShDown = $5032;    CtrlDown = $9100;    AltDown = $A000;
  Left = $4B00;     ShLeft = $4B34;    CtrlLeft = $7300;    AltLeft = $9B00;
 Right = $4D00;    ShRight = $4D36;   CtrlRight = $7400;   AltRight = $9D00;
  Home = $4700;     ShHome = $4737;    CtrlHome = $7700;    AltHome = $9700;
endKey = $4F00;      Shend = $4F31;     Ctrlend = $7500;     Altend = $9F00;
  PgUp = $4900;     ShPgUp = $4939;    CtrlPgUp = $8400;    AltPgUp = $9900;
  PgDn = $5100;     ShPgDn = $5133;    CtrlPgDn = $7600;    AltPgDn = $A100;
   Ins = $5200;      ShIns = $5230;     CtrlIns = $9200;     AltIns = $A200;
   Del = $5300;      ShDel = $532E;     CtrlDel = $9300;     AltDel = $A300;
  Pad5 = $4C00;     ShPad5 = $4C35;    CtrlPad5 = $8F00;    AltPad5 = $9C00;

(* Alphabetic keys *)
  LowA = $1E61;        UpA = $1E41;       CtrlA = $1E01;       AltA = $1E00;
  LowB = $3062;        UpB = $3042;       CtrlB = $3002;       AltB = $3000;
  LowC = $2E63;        UpC = $2E43;       CtrlC = $2E03;       AltC = $2E00;
  LowD = $2064;        UpD = $2044;       CtrlD = $2004;       AltD = $2000;
  LowE = $1265;        UpE = $1245;       CtrlE = $1205;       AltE = $1200;
  LowF = $2166;        UpF = $2146;       CtrlF = $2106;       AltF = $2100;
  LowG = $2267;        UpG = $2247;       CtrlG = $2207;       AltG = $2200;
  LowH = $2368;        UpH = $2348;       CtrlH = $2308;       AltH = $2300;
  LowI = $1769;        UpI = $1749;       CtrlI = $1709;       AltI = $1700;
  LowJ = $246A;        UpJ = $244A;       CtrlJ = $240A;       AltJ = $2400;
  LowK = $256B;        UpK = $254B;       CtrlK = $250B;       AltK = $2500;
  LowL = $266C;        UpL = $264C;       CtrlL = $260C;       AltL = $2600;
  LowM = $326D;        UpM = $324D;       CtrlM = $320D;       AltM = $3200;
  LowN = $316E;        UpN = $314E;       CtrlN = $310E;       AltN = $3100;
  LowO = $186F;        UpO = $184F;       CtrlO = $180F;       AltO = $1800;
  LowP = $1970;        UpP = $1950;       CtrlP = $1910;       AltP = $1900;
  LowQ = $1071;        UpQ = $1051;       CtrlQ = $1011;       AltQ = $1000;
  LowR = $1372;        UpR = $1352;       CtrlR = $1312;       AltR = $1300;
  LowS = $1F73;        UpS = $1F53;       CtrlS = $1F13;       AltS = $1F00;
  LowT = $1474;        UpT = $1454;       CtrlT = $1414;       AltT = $1400;
  LowU = $1675;        UpU = $1655;       CtrlU = $1615;       AltU = $1600;
  LowV = $2F76;        UpV = $2F56;       CtrlV = $2F16;       AltV = $2F00;
  LowW = $1177;        UpW = $1157;       CtrlW = $1117;       AltW = $1100;
  LowX = $2D78;        UpX = $2D58;       CtrlX = $2D18;       AltX = $2D00;
  LowY = $1579;        UpY = $1559;       CtrlY = $1519;       AltY = $1500;
  LowZ = $2C7A;        UpZ = $2C5A;       CtrlZ = $2C1A;       AltZ = $2C00;

(* Number keys, on top row of keyboard *)
  Num1 = $0231;                                                Alt1 = $7800;
  Num2 = $0332;                           Ctrl2 = $0300;       Alt2 = $7900;
  Num3 = $0433;                                                Alt3 = $7A00;
  Num4 = $0534;                                                Alt4 = $7B00;
  Num5 = $0635;                                                Alt5 = $7C00;
  Num6 = $0736;                           Ctrl6 = $071E;       Alt6 = $7D00;
  Num7 = $0837;                                                Alt7 = $7E00;
  Num8 = $0938;                                                Alt8 = $7F00;
  Num9 = $0A39;                                                Alt9 = $8000;
  Num0 = $0B30;                                                Alt0 = $8100;

(* Miscellaneous *)
   Space = $3920;
    BkSp = $0E08;                   CtrlBkSp = $0E7F;       AltBkSp = $0E00;
     Tab = $0F09;   ShTab = $0F00;  CtrlTab  = $9400;        AltTab = $A500;
   Enter = $1C0D;                   CtrlEnter= $1C0A;      AltEnter = $1C00;
     Esc = $011B;                                            AltEsc = $0100;

   Minus = $0C2D;                  CtrlMinus = $0C1F;      AltMinus = $8200;
                     Plus = $0D2B;                          AltPlus = $8300;
PadMinus = $4A2D;               CtrlPadMinus = $8E00;    AltPadMinus= $4A00;
 PadPlus = $4E2B;                CtrlPadPlus = $9000;    AltPadPlus = $4E00;
                     Star = $092A;
 PadStar = $372A;                                        AltPadStar = $3700;

{AM>I do like so,
AM>Command_Keys : Set of Char ['Q', 'A', 'K'];
  >Is there a way to add extended keys to the above.

  Hi Andrew!
  One painless way is to set the high bit For Function keys.
}
Uses Crt;
Const
  Home   = #199;      UArr  = #200;     PgUp  = #201;
  LArr   = #203;      Five  = #204;     RArr  = #205;
  endkey = #207;      DArr  = #208;     PgDn  = #209;
  Ins   = #210;       Del   = #211;

  CtrlHome = #247;    CtrlUP   = #141;    CtrlPgUp = #138;
  CtrlLArr = #243;    CtrlFive = #143;    CtrlRArr = #244;
  Ctrlend  = #245;    CtrlDown = #145;    CtrlPgDn = #246;
  CtrlIns  = #146;    CtrlDel  = #147;

  BackSp  = #8;
  Tab     = #9;       STab    = #143;
  Enter   = #13;
  Esc     = #27;

  CtrlPrtsc = #242;

  CtrlA  = #1;     AltA  = #158;        Alt1 = #248;
  CtrlB  = #2;     AltB  = #176;        Alt2 = #249;
  CtrlC  = #3;     AltC  = #174;        Alt3 = #250;
  CtrlD  = #4;     AltD  = #160;        Alt4 = #251;
  CtrlE  = #5;     AltE  = #146;        Alt5 = #252;
  CtrlF  = #6;     AltF  = #161;        Alt6 = #253;
  CtrlG  = #7;     AltG  = #162;        Alt7 = #254;
  CtrlH  = #8;     AltH  = #163;        Alt8 = #255;
  CtrlI  = #9;     AltI  = #151;        Alt9 = #134;
  CtrlJ  = #10;    AltJ  = #164;        Alt0 = #135;
  CtrlK  = #11;    AltK  = #165;        Altminus  = #136;
  CtrlL  = #12;    AltL  = #166;        Altequals = #137;
  CtrlM  = #13;    AltM  = #178;
  CtrlN  = #14;    AltN  = #177;
  CtrlO  = #15;    AltO  = #152;
  CtrlP  = #16;    AltP  = #153;
  CtrlQ  = #17;    AltQ  = #144;
  CtrlR  = #18;    AltR  = #147;
  CtrlS  = #19;    AltS  = #159;
  CtrlT  = #20;    AltT  = #148;
  CtrlU  = #21;    AltU  = #150;
  CtrlV  = #22;    AltV  = #175;
  CtrlW  = #23;    AltW  = #145;
  CtrlX  = #24;    AltX  = #173;
  CtrlY  = #25;    AltY  = #149;
  CtrlZ  = #26;    AltZ  = #172;

  F1  = #187;      sF1  = #212;      CtrlF1  = #222;      AltF1  = #232;
  F2  = #188;      sF2  = #213;      CtrlF2  = #223;      AltF2  = #233;
  F3  = #189;      sF3  = #214;      CtrlF3  = #224;      AltF3  = #234;
  F4  = #190;      sF4  = #215;      CtrlF4  = #225;      AltF4  = #235;
  F5  = #191;      sF5  = #216;      CtrlF5  = #226;      AltF5  = #236;
  F6  = #192;      sF6  = #217;      CtrlF6  = #227;      AltF6  = #237;
  F7  = #193;      sF7  = #218;      CtrlF7  = #228;      AltF7  = #238;
  F8  = #194;      sF8  = #219;      CtrlF8  = #229;      AltF8  = #239;
  F9  = #195;      sF9  = #220;      CtrlF9  = #230;      AltF9  = #240;
  F10 = #196;      sF10 = #221;      CtrlF10 = #231;      AltF10 = #241;
  F11 = #139;      sF11 = #141;      CtrlF11 = #154;      AltF11 = #156;
  F12 = #140;      sF12 = #142;      CtrlF12 = #155;      AltF12 = #157;

  Key  : Char = #0;

Var
  NextOn        : ^Word Absolute $0040:$001A;    {keyboard buffer}
  NextOff       : ^Word Absolute $0040:$001C;    {keyboard buffer}
  KeyStatusBits : Word    Absolute $0040:$0017;  {keyboard buffer}
  KeyStatus : Record
     RShift, LShift,
     RCtrl,  LCtrl,
     RAlt,   LAlt,
     Caps,   CapsON,
     Ins,    InsON,
     Scroll, ScrlON,
     Num,    NumON          : Boolean;
  end;

Procedure GetKeyStatus;   { Changes KeyStatus Variable }
Const Old : Word = 0;
begin
  Old := KeyStatusBits;
  FillChar(KeyStatus,SizeOf(KeyStatus),0);
  With KeyStatus do
  begin
   RShift := ((Old Shr 0 ) and 1) = 1;
   LShift := ((Old Shr 1 ) and 1) = 1;
   RCtrl  := ((Old Shr 2 ) and 1) = 1;  { Test For either CTRL Key }
   RAlt   := ((Old Shr 3 ) and 1) = 1;  { Test For either Alt Key }
   ScrlON := ((Old Shr 4 ) and 1) = 1;  { Is Scroll Lock light on }
   NumON  := ((Old Shr 5 ) and 1) = 1;  { Is Num Lock light on }
   CapsON := ((Old Shr 6 ) and 1) = 1;  { Is Caps Lock light on }
   InsON  := ((Old Shr 7 ) and 1) = 1;  { Is Insert State on }
   LCtrl  := ((Old Shr 8 ) and 1) = 1;  { This also sets bit 3 }
   LAlt   := ((Old Shr 9 ) and 1) = 1;  { This also sets bit 4 }
   Scroll := ((Old Shr 12) and 1) = 1;  { This toggles bit 5 }
   Num    := ((Old Shr 13) and 1) = 1;  { This toggles bit 6 }
   Caps   := ((Old Shr 14) and 1) = 1;  { This toggles bit 7 }
   Ins    := ((Old Shr 15) and 1) = 1;  { This toggles bit 8 }
  end;
end; { }

Function GetKey : Char;
begin
  If KeyPressed then         { Test For BIOS key pressed }
   begin
     Key := ReadKey;          { Basic BIOS Keyboard Entry }
     if Key = #0 then
     begin
       Key := ReadKey;
       Inc(Key,128);          { Make Expanded key codes one Byte }
     end; { }
   end else Key := #0;
   GetKey := Key;
end; { }

Procedure FlushBuffer;
begin
  Move(NextOn,NextOff,SizeOf(NextOn));
end; { }

Var test : Char ;
begin
  ClrScr;
  WriteLN('Press Both Shift Keys to end');
  Repeat
    GetKeyStatus;
    Test := GetKey;
    if Test <> #0 Then Write(Test);

  Until (KeyStatus.RShift and KeyStatus.LShift);
end.

[Back to KEYBOARD SWAG index]  [Back to Main SWAG index]  [Original]