community.borland.com

Article #15488: How to read an enhanced keyboard

 Technical Information Database

TI488D.txt   How to read an enhanced keyboard
Category   :General Programming
Platform    :All
Product    :Pascal  All

Description:
{
The code included in this example shows how to read
an enhanced keyboard using Turbo Pascal. That is, it detects
if the F11, F12, etc keys are pressed. It provides a substitute
for the ReadKey and KeyPressed functions.
     This TI includes two source files, the first a unit
called ENHKEY.PAS and the second a test program called TEST.PAS.
ENHKEY.PAS contains three routines:

   KeyEPressed: Works just like the CRT routine called
KeyPressed,
          except it detects keypresses on enhanced keys.

   NewReadKey:  Works very much like ReadKey, except it detects
          enhanced keys.

   ReadEKey:    This is the raw readkey function. It returns a
word.
          The high order word contains the scan code and the
          low word contains the regular key. Some users might
          not want to call this function directle, but instead
          might want to access it through the NewReadKey
function,
          which acts much more like the original ReadKey function
          from the CRT unit.

     The code in the EnhKey unit depends on interrupt 16h,
functions
10 and 11, both of which assume the presence of AT or better
computer.
In this day and age, that's a fairly safe bet, but you should be
aware
that this code will not run on an old XT.
     Notice that if NewReadKey returns zero the first time it is
called, you can grab the scan code in the global variable
ScanCode,
or you can call NewReadKey a second time to return the ScanCode.
}

unit EnhKey;

interface

var
  ScanCode: Byte;

function KeyEPressed: Boolean;
function ReadEKey: Word;
function NewReadKey: Char;

implementation

function KeyEPressed: Boolean; assembler;
asm
  mov ah, $11
  int 16h
  mov ax, 1
  jnz 

True
  xor ax, ax


True:
end;

function ReadEKey: Word; assembler;
asm
  mov ah, 10h
  int 16h
end;

function NewReadKey: Char;
var
  Ch: Word;
begin
  if ScanCode <> 0 then begin
    NewReadKey := Char(ScanCode);
    ScanCode := 0;
    exit;
  end;
  Ch := ReadEKey;
  if Lo(Ch) = 0 then begin
    ScanCode := Hi(Ch);
    NewReadKey := #0;
    exit;
  end;
  NewReadKey := Char(Lo(Ch));
end;

begin
  ScanCode := 0;
end.
begin
  ScanCode := 0;
end.

{ ================= The Test Program ================ }

program Test;
uses
  EnhKey;

var
  Ch: Char;
  i: Integer;
begin
  i := 0;
  while (Ch <> #27) do begin
    if KeyEpressed then begin
      Ch := NewReadKey;
      if Ch = #0 then begin
     Ch := NewReadKey;
     WriteLn('Enhanced: ', Ch)
      end else
     WriteLn('Normal: ', Ch);
      inc(i);
    end;
  end;
end.


Reference:


7/16/98 4:33:45 PM
 

Last Modified: 01-SEP-99