Операционная система Microsoft Windows 3.1 для программиста. Дополнительные главы

Драйвер клавиатуры


В стандартном режиме работы Windows используется драйвер клавиатуры в виде обычной DLL-библиотеки. Основное назначение драйвера клавиатуры, как нетрудно догадаться, заключается в определении скан-кода нажатой или отпущенной клавиши, преобразования его в код ANSI и передаче этих кодов Windows для создания соответствующего сообщения WM_KEYDOWN или WM_KEYUP. Клавиатурное сообщение будет затем записано в очередь приложения, имеющего фокус ввода.

Процедура передачи кодов заключается в вызове процедуры, адрес которой Windows передает драйверу при инициализации драйвера. Эта процедура называется процедурой события (Event Procedure).

Менее очевидно второе назначение драйвера клавиатуры, которое состоит в преобразовании кодировки символов из стандарта OEM в стандарт ANSI и обратно.

Почему задача преобразования кодов возложена именно на драйвер клавиатуры? Ответ заключается в том, что при разработке этого драйвера приходится решать проблемы использования символов национального языка: внешний вид или, как говорят, раскладка клавиатуры зависит от национальных особенностей и состава алфавита.

Поэтому в комплекте с драйвером клавиатуры поставляются библиотеки перекодировки и таблицы перекодировки, по одной для каждого национального языка. Таблица перекодировки предназначена для преобразования кодировки символов из стандарта OEM в стандарт ANSI и обратно. Библиотеки перекодировки - это обычные DLL-библиотеки, которые содержат табличную информацию о раскладке клавиатуры.

После всего сказанного выше для вас не будет удивительно, что драйвер клавиатуры экспортирует среди прочих такие функции, как VkKeyScan, AnsiToOem и OemToAnsi.

В расширенном режиме работы Windows в дело включается виртуальный драйвер клавиатуры, задачей которого является виртуализация клавиатуры для ее совместного использования одновременно работающими виртуальными машинами MS-DOS и системной виртуальной машиной Windows.

Дополнительно виртуальный драйвер клавиатуры обеспечивает симулирование клавиатурного ввода при выполнении операции вставки содержимого Clipboard в окно виртуальной машины MS-DOS (эта возможность есть только в расширенном режиме работы Windows).




При этом виртуальный драйвер клавиатуры определяет метод, используемый программой MS-DOS для ввода с клавиатуры - вызов прерывания INT 16h или непосредственное сканирование клавиатурного буфера в области данных BIOS.

Еще одно назначение виртуального драйвера клавиатуры - обработка клавиш активизации или ускоренного запуска (Hot Key). Если пользователь нажмет такую клавишу, будет запущено соответствующее приложение или выполнены другие действия.

Виртуальный драйвер клавиатуры может также обеспечить доступ к клавиатуре другим виртуальным драйверам, войдя в так называемый режим сообщений (Message Mode).



Драйвер клавиатуры подключается в секции [boot] файла system.ini:

keyboard.drv=keyboard.drv

Кроме этого, используется секция [keyboard]:

[keyboard] subtype= type=4 keyboard.dll= oemansi.bin=xlat866.bin

С помощью строки type задается тип клавиатуры. Значение 1 соответствует клавиатуре XT, значение 4 - клавиатуре AT.

Строка subtype нужна только для драйвера клавиатуры Olivetti и описывает разновидность клавиатуры внутри одного типа.

При помощи строки keyboard.dll задается библиотека перекодировки, определяющая раскладку клавиатуры. По умолчанию используется американский вариант расположения клавиш.

Строка oemansi.bin определяет таблицу перекодировки символов из стандарта OEM в стандарт ANSI и обратно. Для корректной перекодировки текстов, содержащих символы кириллицы, необходимо использовать специальную таблицу, которая поставляется в составе таких средств русификации Windows, как CyrWin или ParaWin.

Еще одно небольшое замечание относительно использования символов кириллицы.

Есть два подхода в решении этой проблемы. Первый заключается в использовании русифицированных версий MS-DOS, Windows и других продуктов. Русификация выполнена А.О. Microsoft, поэтому можно считать, что она сделана профессионально. При втором подходе вы отдельно приобретаете оригинальные версии MS-DOS, Windows и т. п., и отдельно средства русификации, такие, как CyrWin, ParaWin, WinOrfo, Hameleon и т.


п.

Первый подход обычно удобен для начинающих пользователей, не привыкших к англоязычным версиям программ. Вы просто устанавливаете им русские версии программных продуктов, и они сразу начинают работать.

Второй подход обеспечивает возможность работы с символами кириллицы без перевода на русский язык меню и сообщений. Он используется профессиональными программистами и теми, для кого языковый барьер не является проблемой. Такие пользователи тяжело воспринимают переход к русским версиям, так как все строки меню и термины изменились до неузнаваемости и им трудной найти то, что нужно. Кроме того, работая с русскими версиями, пользователи будут вынуждены ждать появления русифицированного варианта новой версии, в то время как оригинальный вариант уже доступен.

Поэтому в настоящий момент, несмотря на то что А.О. Microsoft своевременно выпускает русские версии программных продуктов, по-прежнему существует необходимость в средствах русификации оригинальных операционных систем и прикладных программ.

Для того чтобы средства русификации Windows работали правильно, желательна правильная русификация MS-DOS. В частности, необходимо обеспечить в MS-DOS кодовую страницу с номером 866.

Самый простой способ корректной русификации оригинальной версии MS-DOS заключается в замене файлов ega.cpi и country.sys на аналогичные файлы из русифицированной MS-DOS с внесением соответствующих изменений в файлы config.sys и autoexec.bat.

В файле config.sys следует указать код страны 7 и подключить драйвер дисплея display.sys, указав кодовую страницу 866:

COUNTRY=7,,C:\CYR\COUNTRY.SYS DEVICE=C:\DOS\DISPLAY.SYS CON=(EGA,866,1)

В файле autoexec.bat нужно подготовить и загрузить шрифт, соответствующий 866-й кодовой странице:

C:\DOS\MODE CON CP PREP=((866) C:\CYR\EGA.CPI) C:\DOS\MODE CON CP SEL=866

Кроме этого, можно подключить любую резидентную программу русификации клавиатуры, не загружающую экранные шрифты или допускающую отключение такой загрузки, например, keyrus:

C:\KEYR\KEYRUS /KEYS=C:\KEYR\KBDMAIN /ROM /GRAPH=16

Далее следует русифицировать Windows, запустив CyrWin или аналогичное изделие.

При выполнении русификации описанным выше способом обеспечивается согласованное использование кодовой страницы 866 как в MS-DOS, так и в Windows. Большинство обычных русификаторов MS-DOS ограничиваются лишь загрузкой экранных шрифтов и переключением раскладки клавиатуры, нисколько не беспокоясь об изменении номера кодовой страницы в MS-DOS.

До сих пор нам не встречалось ни одно комплексное средство русификации MS-DOS и Windows, которое бы с одной стороны, было бы удобно в работе, а с другой - выполняло бы корректную русификацию MS-DOS и Windows с заменой всех необходимых шрифтов (в частности, часто используемого шрифта MS Sans Serif). Возможно, что вы сможете решить эту проблему. Исходные тексты драйвера клавиатуры, библиотек перекодировки и таблиц перекодировки есть в DDK, так что можно попробовать!


Содержание раздела