Расширяем функциональность клавиатуры

в 18:33, , рубрики: Delphi, open source, клавиатура, Программирование, Софт, хук, метки: , , , ,

На сегодняшний день производители клавиатур предлагают нам довольно широкий выбор самых различных вариантов обозначенных устройств ввода. От расширенных версий с дополнительными кнопками для большего удобства управления компьютером, до версий с урезанным количеством клавиш, направленное, кхм… на все то же увеличение удобства. Что ж, предлагаю взглянуть на вопрос улучшения работы с клавиатурой не столько с аппаратной точки зрения, сколько с программной.

Итак, рассмотрим принцип работы клавиатуры, а именно нажатие клавиши. Само нажатие состоит из трех событий — непосредственно нажатие, удерживание и отпускание клавиши. При этом, при вводе символа используется только нажатие, удерживание в большинстве случаев играет роль только для модификаторов Shift, Ctrl, Alt, а также для навигации, удаления и некоторых других системных клавиш. Конечно есть еще автоповтор, который для символьных клавиш используется крайне редко (как показывает практика, при необходимости набрать один и тот же символ, пользователь скорее нажмет несколько раз одну и туже кнопку, чем воспользуется автоповтором). В таком случае, событие удерживания клавиши можно использовать в более полезных целях — а именно при удерживании клавиши превратить ее в модификатор, который сможет создать дополнительные комбинации клавиш. К слову, удерживание клавиши нашло себе применение в мобильных клавиатурах. Так, например в Smart Keyboard для Android при удерживании буквы на экранной клавиатуре, вы получите вставку альтернативного символа либо числа (к примеру, вместо «й»-«1», «ц»-«2», «р»-"*" и т.д.) что довольно удобно в условиях ограниченного экранного пространства.

Но вернемся к модификаторам. Предлагаемый в этом топике подход, рассматривает использование удерживания клавиши для смены функциональной раскладки клавиатуры. К примеру, если удерживается клавиша «f», блокируем вставку этого символа и ждем на следующие нажатые клавиши, временно блокируя саму вставку символов. Если была нажата и отпущена кнопка которой мы назначили какую-то функцию в данной функциональной раскладке, можно считать что раскладка сработала, выполняем назначенную функцию и продолжаем блокировать вставку символов пока удерживается клавиша изменения раскладки (в данном случае это «f»). Если же по отпусканию «f» ни одна функциональная клавиша не была нажата — производим вставку набранных символов, которые ранее были заблокированы.

Рассмотрим это на более наглядном примере.

image

На рисунке изображена цифровая раскладка на символьных клавишах. Если удерживая клавишу «f» (клавиша смены раскладки) нажать и отпустить «j», мы получим вставку символа «4». При использовании комбинации f-h получим нажатие клавиши ввода. Кстати при комбинации f-' (или а-э в русской раскладке) мы получим символ апострофа, независимо от использованной языковой раскладки (что довольно удобно, так как ни русская, ни украинская языковая раскладка не предусматривает наличие этого символа).
Приведем еще один более интересный пример:

Расширяем функциональность клавиатуры

Здесь уже изображена навигационная раскладка. Примечательным является то, что для активации раскладки может использоваться одна из четырех клавиш (hjkl). Так удерживая «j» мы просто активируем навигационную раскладку, удерживая «k» — активируем раскладку с эмуляцией нажатия Ctrl. Таким образом, нажимая в текстовом редакторе комбинацию j-a мы просто сместим курсор влево, k-a — перейдем к началу слова слева (эквивалент Ctrl+стрелка влево, можно также использовать Ctrl+j-a), h-a — выделим фрагмент текста от курсора, до начала слова слева (эквивалент Ctrl+Shift+стрелка влево). Вероятно вы уже успели заметить, что клавиши расположены для удобного нажатия при слепом наборе. Действительно, на практике подобный подход дает повышение удобства редактирования текста — пальцы не отдаляются слишком далеко от стартовых позиций, что уменьшает необходимость лишний раз передвигать руки по всей клавиатуре и увеличивает скорость редактирования текста.

Конечно же теория подкрепленная практикой выглядит куда более интересней, так что для реализации идеи было написано экспериментальное программное обеспечение, которое реализует описанные принципы работы для ОС Windows. Сама программа позволяет добавить одну из трех функций для выбранной клавиатурной клавиши:
1. Смена функциональной раскладки, как и описывалось ранее. Можно также сменить раскладку в режиме переключателя (toggle), когда первое нажатие клавиши включает заданную раскладку, второе — ее выключает.
2. Симуляция нажатия клавиатурной клавиши. Здесь все просто — задаем код клавиши, которая должна нажиматься вместо выбранной (нужную клавишу можно нажать в поле ввода, или вставить уже известный код). Можно также указывать коды мультимедийных клавиш (увеличить громкость, приостановить проигрывание, открыть калькулятор), тем самым, превратив даже обычную клавиатуру в мультимедийную.
3. Вставить фрагмент текста. Так нажатием всего одной кнопки можно вставить фрагмент текста. Кроме того в самом тексте допускается нажатие системных клавиш путем прописывания их имен в фигурных скобках. К примеру, использование такого текста: «return;{left}» вставит текст «return;» и передвинет каретку влево. «Без{enter}паники!» — вставит слово «Без» и с новой строчки «паники!». Ну а выполняя следующий текст: «42{backspace 2}» вы сделаете сразу две полезные вещи — ответите на главный вопрос жизни, и быстренько его удалите, чтобы никто не увидел. Более детальное описание использования системных команд можно найти в архиве с программой.

Кроме выше описанных раскладок в программе также предусмотрены раскладки для быстрой вставки текстовых смайликов и некоторые шаблоны для программирования. Так же клавиша CapsLock используется в режиме переключателя для функциональной раскладки, совмещающей в себе навигационные и цифровые клавиши изображенные на рисунках. Конечно же, все комбинации клавиш можно легко переназначить и добавить свои. Если часто приходиться набирать одни и те же варианты фраз, тогда довольно удобно использовать комбинации клавиш, которые обозначают две первых буквы фразы. Так комбинация r-e может вставлять слово «return», e-x — «exit», b-e — «begin» и т.д.

Как заключение хочу отметить, что за месяц работы с указанной программой, удобность использования клавиатуры существенно возросла. Особенно это заметно при использовании ноутбука — куда проще воспользоваться комбинацией клавиш, которые постоянно под пальцами, чем нащупывать мелкие кнопки home, end находящиеся в неудобных местах. Также при скорости набора 200-250 символов в минуту не было обнаружено ни одного ложного срабатывания функциональных символьных комбинаций, хотя я и не исключаю, что подобные срабатывания все-таки могут быть, особенно у людей, которые при наборе текста могут подолгу удерживать символьные клавиши.

Скачать саму программу можно здесь, а исходники здесь.

Рассмотрим принципы работы приложения. Средство разработки — Делфи 7. Для получения информации о событиях клавиатуры устанавливается низкоуровневый хук на клавиатуру (функция SetWindowsHookEx с параметром WH_KEYBOARD_LL). Подобный подход позволяет получать события WM_KEYDOWN, WM_KEYUP, WM_SYSKEYDOWN, WM_SYSKEYUP, виртуальный код клавиши, а также информацию о том является ли это событие результатом нажатия клавиши на клавиатуре или программной вставки. Ну и конечно же исключить подальшую обработку события. Здесь следует заметить, что слишком тяжелый код в обработке данного хука, может привести к подтормаживаниям при вставке символов. Получив сообщение от клавиатуры, первым делом смотрим кто его послал — если сообщение было сгенерировано самой программой, то пропускаем его дальше в систему. Если же пришло сообщение WM_KEYDOWN (или WM_SYSKEYDOWN) то смотрим стоит ли его блокировать согласно конфигурациям программы. При блокировании запоминаем нажатую клавишу, а также системные клавиши (Shift, Ctrl, Alt) — это необходимо в случае, когда комбинация при смене раскладки не сработала и необходимо возобновить заблокированные сообщения (со всеми системными модификаторами). В случае если согласно текущей раскладки сработала комбинация клавиш — вставляем свои события клавиатуры. Для отправки своих сообщений клавиатуры используется функция SendInput.

Ну и как альтернативный вариант расширения функциональности клавиатуры можно использовать программу The Microsoft Keyboard Layout Creator которая помогает создать свою языковую раскладку, включающую в себя расширенные комбинации клавиш с Shift, Ctrl, Alt, AltGr и даже CapsLock.

Также на Хабре уже обсуждалась тема о разработке и применению одной функциональной раскладки:
Лайфхак клавиатуры для удобной навигации по тексту

Автор: Corwal

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js