Розширюємо функціональність клавіатури
На сьогоднішній день виробники клавіатур пропонують нам досить широкий вибір різних варіантів позначених пристроїв введення. Від розширених версій з додатковими кнопками для більшої зручності керування комп'ютером, до версій із урізаною кількістю клавіш, спрямоване, кхм… на все те ж збільшення зручності. Що ж, пропоную поглянути на питання покращення роботи з клавіатурою не стільки з апаратної точки зору, скільки з програмною.
Розглянемо принцип роботи клавіатури, а саме натискання клавіші. Саме натискання складається з трьох подій - безпосередньо натискання, утримування та відпускання клавіші. При цьому при введенні символу використовується лише натискання, утримування в більшості випадків відіграє роль тільки для модифікаторів Shift, Ctrl, Alt, а також для навігації, видалення та деяких інших системних клавіш. Звичайно є ще автоповтор, який для символьних клавіш використовується вкрай рідко (як показує практика, при необхідності набрати той самий символ, користувач швидше натисне кілька разів одну й ту ж кнопку, ніж скористається автоповтором). У такому випадку, подію утримування клавіші можна використовувати з більш корисною метою — а саме при утримуванні клавіші перетворити її на модифікатор, який зможе створити додаткові комбінації клавіш. До речі, утримування клавіші знайшло застосування в мобільних клавіатурах. Так, наприклад, у Smart Keyboard для Android при утримуванні літери на екранній клавіатурі, ви отримаєте вставку альтернативного символу або числа (наприклад, замість «й»-«1», «ц»-«2», «р»-"*" і т.д.) що досить зручно за умов обмеженого екранного простору.
Але повернемось до модифікаторів. Пропонований у цьому топіці підхід, розглядає використання утримування клавіші зміни функціональноїклавіатури. Наприклад, якщо утримується клавіша «f», блокуємо вставку цього символу і чекаємо наступні натиснені клавіші, тимчасово блокуючи саму вставку символів. Якщо була натиснута і відпущена кнопка якої ми призначили якусь функцію в даній функціональній розкладці, можна вважати, що розкладка спрацювала, виконуємо призначену функцію і продовжуємо блокувати вставку символів, поки утримується клавіша зміни розкладки (в даному випадку це «f»). Якщо ж після відпускання «f» жодна функціональна клавіша не була натиснута — вставляємо набрані символи, які раніше були заблоковані.
Розглянемо це більш наочному прикладі.

На малюнку зображено цифрову розкладку на символьних клавішах. Якщо утримуючи клавішу f (клавіша зміни розкладки) натиснути та відпустити j, ми отримаємо вставку символу 4. При використанні комбінації f-h отримаємо натискання кнопки введення. До речі, при комбінації f-' (або а-е в українській розкладці) ми отримаємо символ апострофа, незалежно від використаної мовної розкладки (що досить зручно, оскільки ні українська, ні українська мовна розкладка не передбачає наявність цього символу). Наведемо ще один цікавіший приклад:

Звичайно ж теорія підкріплена практикою виглядає набагато цікавішою, так що для реалізації ідеї було написано експериментальне програмне забезпечення, яке реалізує описані принципи роботи для ОС Windows. Сама програма дозволяє додати одну з трьох функцій для вибраної клавіатурної клавіші: 1. Зміна функціональної розкладки, як і описувалося раніше. Можна також змінити розкладку в режимі перемикача, коли перше натискання клавіші включає задану розкладку, друге — її вимикає. 2. Симуляція натискання клавіатурноїклавіші. Тут все просто - задаємо код клавіші, яка повинна натискатися замість обраної (потрібну клавішу можна натиснути в поле введення або вставити вже відомий код). Можна також вказувати коди мультимедійних клавіш (збільшити гучність, призупинити програвання, відкрити калькулятор), тим самим перетворивши навіть звичайну клавіатуру на мультимедійну. 3. Вставити фрагмент тексту. Так натисканням лише однієї кнопки можна вставити фрагмент тексту. Крім того, у самому тексті допускається натискання системних клавіш шляхом прописування їх імен у фігурних дужках. Наприклад, використання тексту: «return;» вставить текст "return;" і пересуне каретку вліво. "Без паніки!" - Вставить слово "Без" і з нового рядка "паніки!". Ну а виконуючи наступний текст: «42» ви зробите відразу дві корисні речі — дайте відповідь на головне питання життя, і швиденько його видаліть, щоб ніхто не побачив. Більш детальний опис використання системних команд можна знайти в архіві програми.
Як висновок хочу відзначити, що за місяць роботи із зазначеною програмою, зручність використання клавіатури суттєво зросла. Особливо це помітно при використанні ноутбука - куди простіше скористатися комбінацією клавіш, які постійно під пальцями, ніж намацувати дрібні кнопки home, які знаходяться в незручних місцях. Також при швидкості набору 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.
Також на Хабрі вже обговорювалася тема про розробку та застосування однієї функціональної розкладки: Лайфхак клавіатури для зручної навігації за текстом