Программное стробирование клавиатуры
Описываются принципы организации ввода, когда автоповтор клавиатуры
подменяется автоповтором от мультимедийного таймера
При удерживании какой либо клавиши клавиатура начинает
посылать повторяющиеся коды этой клавиши. Первый интервал - от
1/4 до 1 секунды, все последующие - короче, вполть до 30 символов в секунду.
Аппаратному стробированию (автоповторению) сопутствует ряд недостатков.
- Во-первых, интервалы стробирования одинаковы -
- и для клавиш управления курсором,
- и для клавиш ввода символов,
- и для системных клавиш (выбор, выход, помощь и т.д.).
-
Во-вторых, максимальная частота повторений слишком мала - для операций
движения курсора её можно увеличить в 4-5 раз (что обеспечило бы перемещение
курсора от одного края экрана до другого за пол секунды, а не за 2,5)
-
В третьих движение не может проходить с нарастающей скоростью.
-
В четвёртых, если программа не успевает обработать нажатия, они собираются в буфере
клавиатуры и в некоторых случаях программа продолжает их
отрабатывать уже после того, как пользователь принял решение
прекратить действие и отпустил клавишу. Особенно это нежелательно
для действий типа вход, выход, обращение к подсказке и т.п.
Программное стробирование позволяет обойти все эти недостатки.
Оно реализуется следующим образом:
- Во-первых надо в системе завести мультимедийный таймер, дающий
срабатывания до 1000 раз в секунду.
- Во-вторых, обрабатывать все обслуживания клавиш одинаковым способом,
т.е. из всех процедур оставить FormKeyDown, обращения к FormKeyPressed
и к ShortCut следует убрать.
(Таблица ArrKeys позволяет обойтись без вызова
FormKeyPressed перекодируя нужным образом вызовы FormKeyDown)
Повторные вызовы FormKeyDown с одним и тем же кодом клавиши следует игнорировать
и, наоборот, принимать сообщения от мультимедийного таймера, обслуживая их
как повтор клавиши.
Это достигается взведением специальной логической переменной QStrobe при нажатии на любую
клавишу и её отпусканием при отжатии (FormKeyUp).
- Далее надо сделать таблицу описания допустимх функциональных клавиш.
Описание каждой клавиши будет содержать
- код клавиши, соответствующий переменной Key в FormKeyDown,
- код функции, например, функции перемещения курсора,
- код схемы стробирования для данной функции
Структура, описывающая свойства функциональных клавиш
type
TKeyFuncDef = packed record
Key : word; (* Код КЛАВИШИ *)
Fun : char; (* код функции или МАКРО *)
Stb : byte; (* СХЕМА СТРОБИРОВАНИЯ *)
end;
TArrFunc = packed array [0..255] of TKeyFuncDef;
- Нужно сделать подсистему управления стробированием
набор (массив) схем стробирования ("сценариев" стробирования)
Сценарий стробирования состоит из ФАЗ сценария стробирования.
Каждая фаза описывается двумя числами
- интервалом повторений и
- количеством повторений данного интервала.
У обычной "железной" клавиатуры всего две фазы:
- первая фаза - это большой интервал и одно повторение;
- последняя фаза - маленький интервал и бесконечное число повторений.
Добавив две-три фазы можно добиться плавного ускорения. Без плавного
ускорения из-за инерции восприятия человек будет терять контроль над
курсором на первых шагах.
Для всей совокупности функций такой программы, как текстовый редактор
достаточно трёх схем, сценариев стробирования.
- Схема по умолчанию - для ввода символов, приблизительно такая же,
как обычная аппаратная схема клавиатуры. Это большой первый интервал,
чтобы клавиши не "двоили" при однократных нажатиях, и далее короткий
интервал (но не слишком) для ввода повторяющихся символов. Можно схему
улучшить, немного добавив скорость и промежуточную фазу разгона.
- Схема для управления курсором - несколько шагов, фаз разгона,
укороченный первый интервал и высокая скорость на последней фазе.
- Схема для управляющих команд, которая вообще запрещает
стробирование - т.е. одна фаза в которой интервал повторений
равен бесконечности
Пример использования объекта, упровляющего стробированием можно увидеть
здесь
Литература по теме на сайте
Исходники.ру -
описание соотношений между FormKyDown,FormKeyUp,FormKeyPress,
между событиями на форме и на её компонентах.
Проект SWE для Windows
Основные свойства MIM и SWE(DOS)
(с) Можаровский С.Г. // mailto:mozharovskys@mail.ru // swHome page