Информационный сервер для программистов: Исходники со всего света. Паскальные исходники со всего света
  Powered by Поисковый сервер Яndex: Найдется ВСЁ!
На Главную Исходники Форум Информер Страны мира
   Клавиатура    >>    keystuff
   
 
 Помещение символов в буфер клавиатуры   Виктор Вагнер 19.09.1994

Как имитировать нажатие клавиш и определить, какие клавиши нажаты, но еще не отущены.



1k 
 

From: "Victor B. Wagner" <vitus@agropc.msk.su> Organization: Agroecological problems Center >1 - Кто нибудь программировал контроллер клавиатуры ? > (конкретно интересует имитация нажатия клавиш, > считывание нескольких нажатых и неотпущенных клавиш). А зачем для этого лезть в контроллер клавиатуры? Для того, чтобы сымитировать нажатие клавиш требуется всего лишь запихать код в буфер клавиатуры. В 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; -- Phone: 230-80-61 Victor B.Wagner E-Mail:vitus@agropc.msk.su Dokuchaev Soil Institute 7, Pyzhevsky lane, Moscow, Russia