home *** CD-ROM | disk | FTP | other *** search
- {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.