Деякі особливості роботи з клавіатурою
Щоб ефективно використовувати клавіатуру, добре розуміти, як ведеться обробка натискання клавіш у системі. З клавіатурою пов'язано щонайменше три різновиди кодів: символьні коди, віртуальні коди та скан-коди, і не всім зрозуміла різниця між ними. Спробуємо внести ясність у це заплутане питання.
У Windows все це зроблено настільки заплутано, що далі нікуди, причому ще й організовано дещо по-різному в 9х і в NT (ХР). Там було введено поняття поточної "мови" (крім окремо "розкладки" та "кодової сторінки") - спочатку це просто означало сукупність кодової сторінки та власне розкладки, що логічно. Але з переходом до Unicode поняття "мови" фактично стало жити самостійним життям, а до чого це призводить - ми докладніше обговоримо в розділі 8. Там же ми детальніше поговоримо і про різні кирилиці.
Операційна система (DOS або Windows) може використовувати поверх цього і інші таблиці інтерпретації, паралельно з кодовою сторінкою. Під "іншими таблицями" маються на увазі не тільки національні таблиці символів, а й реалізація, наприклад, такої функції, як введення символу за його номером з натиснутою клавішею (нагадаю, працює тільки лівий, тільки з цифровою клавіатурою, і тільки при включеному). або популярного в DOS-програмах представлення кодів, що управляють (символьні коди 01-31), які неможливо набрати на клавіатурі прямо, через натискання + . Скажімо, дія, аналогічна натисканню , тобто введення кодів 10 + 13, при цьому виглядає як послідовність натискань + , + [1] .
Мал. 6.1. Оригінальна В4-кнопкова клавіатура IBM PC
З усіх цих причин до оригінальних скан-кодів дістатися непросто, але, на щастя, скан-коди в чистому вигляді практично можуть знадобитися нечасто, а точної ідентифікації клавіш вистачить і те, що надає система. Скан-коди присвоювалися розробленої одночасно з IBM PC' 84-кнопковій клавіатурі поспіль (слеаа-направо, зверху-вниз), тому, наприклад, клавіші присвоєно скан-код 01, а наступний код (02) присвоєно не клавіші , як би слід очікувати дивлячись на сучасну стандартну клавіатуру, а клавіші , яка на тій клавіатурі йшла відразу за (рис. 6.1). Ще більша плутанина з системними клавішами на додатковій клавіатурі (ліворуч від цифрової), які на 101/104-кнопочній клавіатурі дублюють функції цифрової клавіатури — це , , клавіші керування курсором і т.п. і т. л. Загальний принцип призначення скан-кодів полягає в наступному: основні скан-коди (вони 7-бітні, наявність 8-го біта означає код відпускання цієї ж клавіші) призначалися тим клавішам, які використовувалися в 84-кно-почному варіанті, а знову введеним дублюючим присвоювалося те саме значення з додаванням другого (старшого) байта, рівного $Е0 (це не відноситься до таких дублюючих клавіш, як, наприклад, правий - вона спочатку була на 84-кнопковій клавіатурі). Однак, як ви побачите з таблиці, поміщеної в додатку2, фактично доступні скан-коди додаткової клавіатури повторюють аналогічні скан-коди цифрової клавіатури, причому при вимкненому ідентичні також і віртуальні коди, а ось при включеному віртуальний код клавіш на цифровій клавіатурі цифр на основній клавіатурі. Особливий код (і віртуальний, і скан-код) і у клавіш і т. п., розташованих поруч із цифровою клавіатурою, тому для них окремо і визначені константи - ідентифікатори віртуальних кодів.
Нотатки на полях
Ця картина спостерігається і в DOS, і в Windows, тобто обробка додаткових кнопок ведеться ще на рівні BIOS. Загалом, зроблено все, щоб заплутати чесного програміста, який наївно припускає, що все має відбуватися відповідно до здорового глузду. Якщо такий програміст хоче знайти погику в цій картині, йому доведеться повернутися до витоків. На самому депв тут все прозоро: наполеглива нерозпичність лівих-правих клавіш-модифікаторів була, очевидно, закладена ще при створенні перших модепей 101-кнопкової клавіатури (а навіщо, вибачте, їх розпикати, якщо вони замислювалися саме як дублюючі?), І тоді? необачно була закладена в BIOS, а далі це потрібно дотримуватися просто для сумісності. Аналогічно сталося і з системними клавішами на додатковій клавіатурі. В той же час віртуальний і сквн-код цифрових клавіш, що відзначається, на цифровій і основний клавіатурах (а також лівого і правого) був закладений а систему з самого початку (ще в часи IBM PC, коли клавіатури були тільки 84-кнопкові), а тоді системні програмісти були іншими, і не стали вирішувати користувачів, як їм інтерпретувати ту чи іншу клааїшу. Ось усі нашарування цих епох ми й змушені тепер розхльобувати. З іншого боку, не можна не відзначити, що нерозрізненість кодів на рівні ОС багато в чому виправдана, наприклад, можна спокійно проектувати будь-яку зручну конфігурацію клавіатури (квк, наприклад, у разі ноутбуків), і все буде сумісне без зайвих складнощів.
Нотатки на полях
У зв'язку з цим розповім одну історію, яка врізалася мені в п'ять, як типовий приклад бездумного і безвідповідального ставлення програміста до своїх обов'язків. Історія, правда, більше відноситься до мишей, а не клавіш, але це не важливо. В одномувеликому провінційному науково-виробничому центрі була розроблена унікальна аппарвтур для гідрографічних досліджень, а саме - для картографування океанського дна. Це було ще під час організації системи DOS, в якій, як відомо, миші різних виробників вимагали обов'язково "рідних" дрвйверів, в іншому випадку відмовлялися рвботвть. Програміст, який робив основну профвмму картографування, вирішив, що буде дуже здорово, якщо він візьме і напише свій драйвер миші саме для цього випадку. Причини, які його спонукали на твій крок, залишилися невідомими — чи він просто не підозрював про існування переривання int33h, яке надає "мишачий" інтерфейс, чи дуже хотів поквзати, що особисто без нього в рейсі не обійдуться. Загалом, на березі програма чудово працювала, тому що всі миші у згаданому НВЦ були закуплені одноразово та централізовано і тим самим, природно, виявились одного виробника. А в морі нічого не стало — на кораблі миші були інші системи. В результаті все ж таки знайшлася одна миша, яка працювала, її головний гідрограф щоразу під час роботи втикав у комп'ютер, а потім ніс до себе в каюту і замикав в особистому сейфі. І все ж таки в якийсь момент у ній зламалася ліва кнопка, і тільки зусиллями вашого покірного ляка, який її полагодив "на коліні", програма досліджень не була зірвана. Хочу застерегти читачів від подібних "приколів" - замість того, щоб дивуватися вашому мистецтву, користувачі швидше за все будуть проклинати на чому світ стоїть.
Тепер про те, як самому визначити віртуальний та скан-код клавіші. Прочитати те, що знаходиться в буфері BIOS, можна з DOS простою програмою на звичайному Pascal, що викликає переривання intl6h:
mov ah,lOh(функція читання зклавіатури)
writeln('Symbol-', xal, 'Scan=', xah);end.
To є після натискання будь-якої клавіші в регістрі ai виявиться кілок символу, а в ah - скан-код (при цьому для керуючих клавіш ai буде 0). Недоліком цього є те, що не розпізнається натискання деяких системних клавіш (типу