Скачать Помещение символов в буфер клавиатуры

19.09.1994
Скачать файл (1,27 Кб)






А зачем для этого лезть в контроллер клавиатуры?

Для того, чтобы сымитировать нажатие клавиш требуется всего лишь запихать код в буфер клавиатуры. В AT-BIOS для этого существует функция 5 прерывания 16H, описание которой найти не сложно. Не намного сложнее напрямую работать с буфером клавиатуры.
Вот текст функции для этой цели из TurboProfessional 5.11

procedure StuffKey(W : Word);
    {-Stuff one key into the keyboard buffer}
  const
    KbdStart = $1E;
    KbdEnd = $3C;
  var
    KbdHead : Word absolute $40 : $1A;
    KbdTail : Word absolute $40 : $1C;
    SaveKbdTail : Word;
  begin
    SaveKbdTail := KbdTail;
    if KbdTail = KbdEnd then
      KbdTail := KbdStart
    else
      Inc(KbdTail, 2);
    if KbdTail = KbdHead then
      KbdTail := SaveKbdTail
    else
      MemW[$40:SaveKbdTail] := W;
  end;

Что же касается считывания нескольких нажатых и неотпущенных клавиш, то придется перехватить INT9 и работать со скэнкодами напрямую

Вот простая программка, поэкспериментировав с которой вы найдете ответ на ваш вопрос. Обратите внимание на то, что она выдает при нажатии клавиши и что при отпускании

Program TestScancode;
Uses Dos,CRT;{CRT здесь существеннен - не следует пользоваться функциями dos
              из обработчика клавиатурного прерывания}
var OldKbdHandler:Pointer;
Procedure Int9;interrupt;
var Scancode:Byte;
begin
 ScanCode:=Port[$60];
 Write(ScanCode:4);
 asm
  Pushf
  Call DWORD PTR OldKbdHandler;
 end;
end;
begin
 GetIntVec($9,OldKbdHandler);
 SetIntVec($9,@Int9);
 Repeat
 Until Readkey=#27;
 SetIntVec($9,OldKbdHandler);
end;