Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Asm: Общие вопросы > Определить нажатие двух кнопок на клаве


Автор: Sunvas 7.12.2007, 13:24
Как отловить нажатие двух кнопок на клавиатуре? Например, двух Shift-ов. Уже час роюсь в нэте - ничего не могу найти. Может статейку кто подскажет?

Автор: SABROG 7.12.2007, 13:42
Когда нажимаешь кнопку, то с контроллера приходит один опкод, при отпускании другой.
Можно создать массив флагов, скажем 101 бит на каждую клавишу.

Одновременное нажатие шифтов это приход подряд двух опкодов. Выставляешь биты соответствующие двум шифтам в 1. В обработчике чтения опкодов делаешь проверку, если приходят опкоды на отпускание клавиш, то флаги сбрасываешь в 0.

По идее все, с битов можно считать какие клавиши не отпускались, т.е. нажаты.

Автор: Sunvas 7.12.2007, 13:51
SABROG, можно хоть небольшой пример?

Автор: SABROG 7.12.2007, 14:06
Зависит от того под чем программа должна работать. DOS, Win, *nix ?

Вот держи ссылку на http://homepages.cwi.nl/~aeb/linux/kbd/scancodes.html#toc9 по контроллерам клавиатуры.

Если прога под чистый дос/win95, то ты сможешь работать с контроллером клавиатуры напрямую.
Если винда, то придется либо писать драйвер, либо изучать API функции, но это уже к MSDNу.

Автор: Sunvas 7.12.2007, 14:32
Прога под чистый дос.

Автор: SABROG 7.12.2007, 14:52
INT 16h, AH = 02h, 12h, 22h — Считать состояние клавиатуры
Ввод: АН = 02h (83/84-key), 12h (101/102-key), 22h (122-key)
Вывод: AL = байт состояния клавиатуры 1
АН = байт состояния клавиатуры 2 (только для функций 12h и 22h)
Байт состояния клавиатуры 1 (этот байт всегда расположен в памяти по адресу 0000h:0417h или 0040h:0017h):
Бит 7: Ins включена
Бит 6: CapsLock включена
Бит 5: NumLock включена
Бит 4: ScrollLock включена
Бит 3: Alt нажата (любая Alt для функции 02h, часто только левая Alt для 12h/22h)
Бит 2: Ctrl нажата (любая Ctrl)
Бит 1: Левая Shift нажата
Бит 0: Правая Shift нажата
Байт состояния клавиатуры 2 (этот байт всегда расположен в памяти по адресу 0000h:0418h или 0040h:0018h):
Бит 7: SysRq нажата
Бит 6: CapsLock нажата
Бит 5: NumLock нажата
Бит 4: ScrollLock нажата
Бит 3: Правая Alt нажата
Бит 2: Правая Ctrl нажата
Бит 1: Левая Alt нажата
Бит 0: Левая Ctrl нажата

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)