Электронная библиотека книг Александра Фролова и Григория Фролова.
Shop2You.ru Создайте свой интернет-магазин
Библиотека
Братьев
Фроловых

Программирование для Windows NT

© Александр Фролов, Григорий Фролов
Том 27, часть 2, М.: Диалог-МИФИ, 1996, 272 стр.

[Назад] [Содеожание] [Дальше]

Изменение раскладки клавиатуры

Помимо изменения текущего набора национальных параметров приложение может изменить раскладку клавиатуры. При этом изменится расположение символов на клавиатуре и генерируемые при нажатии на клавиши символьные коды.

Для изменения раскладки клавиатуры в программном интерфейсе операционной системы Microsoft Windows NT предусмотрено несколько специальных функций.

Получение списка установленных раскладок

При установке операционной системы Microsoft Windows NT или Microsoft Windows 95 пользователь может выбрать для работы одну или несколько раскладок клавиатуры. Для определения списка установленных раскладок вы можете использовать функцию GetKeyboardLayoutList:


UINT GetKeyboardLayoutList(
  int nBuff,    // количество элементов в буфере
  HKL *lpList); // указатель на буфер

Функция GetKeyboardLayoutList записывает в буфер, адрес которого задан параметром lpList, массив идентификаторов установленных раскладок клавиатуры, имеющих тип HKL. Через параметр nBuff вы должны передать функции размер буфера, указанный в количестве идентификаторов типа HKL.

Как определить этот размер?

Для этого достаточно указать функции GetKeyboardLayoutList параметр nBuff, имеющий нулевое значение. При этом функция вернет размер массива, необходимый для записи в него всех идентификаторов.

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


UINT uLayouts;
HKL  *lpList;
uLayouts = GetKeyboardLayoutList(0, NULL);
lpList   = malloc(uLayouts * sizeof(HKL));
uLayouts = GetKeyboardLayoutList(uLayouts, lpList);

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

Операция определения названия национального языка выполняется в приведенном ниже фрагменте кода:


GetLocaleInfo(MAKELCID(((UINT)hklCurrent & 0xffffffff), 
  SORT_DEFAULT), LOCALE_SLANGUAGE, szBuf, 512);

Определение названия текущей раскладки клавиатуры

Для определения названия текущей (активной) расклдаки клавиатуры вы можете воспользоваться функцией GetKeyboardLayoutName:


BOOL GetKeyboardLayoutName(
  LPTSTR pwszKLID); // адрес буфера для имени раскладки

Через единственный параметр вы должны передать этой функции адрес буфера, в который будет записано название раскладки. Размер буфера должен быть не меньше чем KL_NAMELENGTH байт.

Определение идентификатора раскладки клавиатуры для задачи

С помощью функции GetKeyboardLayout приложение может определить идентификатор раскладки клавиатуры, назначенный для данной задачи:


HKL GetKeyboardLayout(
  DWORD dwLayout); // идентификатор задачи

Единственный параметр этой функции определяет идентификатор задачи, для которой нужно определить идентификатор раскладки клавиатуры. Если вы укажите нулевое значение, функция возвратит идентификатор раскладки для текущей задачи.

Загрузка раскладки клавиатуры

С помощью функции LoadKeyboardLayout вы можете загрузить новую раскладку клавиатуры:


HKL LoadKeyboardLayout(
  LPCTSTR pwszKLID, // адрес буфера названия раскладки
  UINT    Flags);   // флаги режима работы функции

При помощи параметра pwszKLID задается имя загружаемой раскладки. Это имя должно задаваться в виде текстовой строки, содержащей значение идентификатора национального языка в текстовом виде. Для загрузки, например, американской раскладки клавиатуры необходимо задать строку 00000409, а для загрузки русской раскладки - строку 00000419.

Параметр Flags задает режимы работы функции LoadKeyboardLayout и может иметь следующие значения:

 Константа

 Описание

 KLF_ACTIVATE

 Если указанная раскладка клавиатуры не была загружена ранее, она загружается и становится активной

 KLF_REORDER

 В этом случае раскладка циклически сдвигается в списке загруженных раскладок

 KLF_SUBSTITUTE_OK

 Использование альтернативной раскладки клавиатуры, указанной в регистрационной базе данных (ключ HKEY_CURRENT_USER\Keyboard Layout\Substitutes)

 KLF_UNLOADPREVIOUS

 Используется вместе с флагом KLF_ACTIVATE и только тогда, когда указанная раскладка уже загружена. В этом случае загруженная ранее раскладка клавиатуры выгружается

Выгрузка раскладки клавиатуры

Зная идентификатор загруженной ранее расклдаки клавиатуры, вы можете выгрузить эту раскладку из памяти. Для этого следует вызвать функцию UnloadKeyboardLayout:


BOOL UnloadKeyboardLayout(
  HKL  hkl); // идентификатор выгружаемой раскладки

В качестве единственного параметра этой функции следует передать идентификатор выгружаемой раскладки клавиатуры hkl.

Переключение раскладки клавиатуры

Последняя функция, которую мы рассмотрим в этом разделе и которая предназначена для работы с раскладками клавиатуры, называется ActivateKeyboardLayout:


BOOL ActivateKeyboardLayout(
  HKL  hkl,    // идентификатор раскладки клавиатуры
  UINT Flags); // флаги режима работы функции

Эта функция делает текущей раскладку клавиатуры, идентификатор которой передается ей через параметр hkl. Вы можете определить этот идентификатор с помощью функции LoadKeyboardLayout или взять из списка загруженных идентификаторов раскладок, который определяется функцией GetKeyboardLayoutList.

Параметр Flags определяет режимы работы функции и имеет следующие значения:

 Константа

 Описание

 KLF_REORDER

 Система выполняет циклический сдвиг раскладок клавиатур в списке

 KLF_UNLOADPREVIOUS

 Выгрузка раскладки, которая раньше была активна

Пример использования функций GetKeyboardLayoutList и ActivateKeyboardLayout вы найдете в исходных текстах приложения SETLOCAL, к описанию которых мы и переходим.

[Назад] [Содеожание] [Дальше]