Расширяем функциональность клавиатурыИсточник: habrahabr Corwal
На сегодняшний день производители клавиатур предлагают нам довольно широкий выбор самых различных вариантов обозначенных устройств ввода. От расширенных версий с дополнительными кнопками для большего удобства управления компьютером, до версий с урезанным количеством клавиш, направленное, кхм… на все то же увеличение удобства. Что ж, предлагаю взглянуть на вопрос улучшения работы с клавиатурой не столько с аппаратной точки зрения, сколько с программной. Но вернемся к модификаторам. Предлагаемый в этом топике подход, рассматривает использование удерживания клавиши для смены функциональной раскладки клавиатуры. К примеру, если удерживается клавиша "f", блокируем вставку этого символа и ждем на следующие нажатые клавиши, временно блокируя саму вставку символов. Если была нажата и отпущена кнопка которой мы назначили какую-то функцию в данной функциональной раскладке, можно считать что раскладка сработала, выполняем назначенную функцию и продолжаем блокировать вставку символов пока удерживается клавиша изменения раскладки (в данном случае это "f"). Если же по отпусканию "f" ни одна функциональная клавиша не была нажата - производим вставку набранных символов, которые ранее были заблокированы. Рассмотрим это на более наглядном примере.
На рисунке изображена цифровая раскладка на символьных клавишах. Если удерживая клавишу "f" (клавиша смены раскладки) нажать и отпустить "j", мы получим вставку символа "4". При использовании комбинации f-h получим нажатие клавиши ввода. Кстати при комбинации f-' (или а-э в русской раскладке) мы получим символ апострофа, независимо от использованной языковой раскладки (что довольно удобно, так как ни русская, ни украинская языковая раскладка не предусматривает наличие этого символа).
Здесь уже изображена навигационная раскладка. Примечательным является то, что для активации раскладки может использоваться одна из четырех клавиш (hjkl). Так удерживая "j" мы просто активируем навигационную раскладку, удерживая "k" - активируем раскладку с эмуляцией нажатия Ctrl. Таким образом, нажимая в текстовом редакторе комбинацию j-a мы просто сместим курсор влево, k-a - перейдем к началу слова слева (эквивалент Ctrl+стрелка влево, можно также использовать Ctrl+j-a), h-a - выделим фрагмент текста от курсора, до начала слова слева (эквивалент Ctrl+Shift+стрелка влево). Вероятно вы уже успели заметить, что клавиши расположены для удобного нажатия при слепом наборе. Действительно, на практике подобный подход дает повышение удобства редактирования текста - пальцы не отдаляются слишком далеко от стартовых позиций, что уменьшает необходимость лишний раз передвигать руки по всей клавиатуре и увеличивает скорость редактирования текста. Конечно же теория подкрепленная практикой выглядит куда более интересней, так что для реализации идеи было написано экспериментальное программное обеспечение, которое реализует описанные принципы работы для ОС Windows. Сама программа позволяет добавить одну из трех функций для выбранной клавиатурной клавиши: Кроме выше описанных раскладок в программе также предусмотрены раскладки для быстрой вставки текстовых смайликов и некоторые шаблоны для программирования. Так же клавиша 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. |