Программирование для 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 и может иметь следующие значения:
Выгрузка раскладки клавиатурыЗная идентификатор загруженной ранее расклдаки клавиатуры, вы можете выгрузить эту раскладку из памяти. Для этого следует вызвать функцию UnloadKeyboardLayout: BOOL UnloadKeyboardLayout( HKL hkl); // идентификатор выгружаемой раскладки В качестве единственного параметра этой функции следует передать идентификатор выгружаемой раскладки клавиатуры hkl. Переключение раскладки клавиатурыПоследняя функция, которую мы рассмотрим в этом разделе и которая предназначена для работы с раскладками клавиатуры, называется ActivateKeyboardLayout: BOOL ActivateKeyboardLayout( HKL hkl, // идентификатор раскладки клавиатуры UINT Flags); // флаги режима работы функции Эта функция делает текущей раскладку клавиатуры, идентификатор которой передается ей через параметр hkl. Вы можете определить этот идентификатор с помощью функции LoadKeyboardLayout или взять из списка загруженных идентификаторов раскладок, который определяется функцией GetKeyboardLayoutList. Параметр Flags определяет режимы работы функции и имеет следующие значения:
Пример использования функций GetKeyboardLayoutList и ActivateKeyboardLayout вы найдете в исходных текстах приложения SETLOCAL, к описанию которых мы и переходим. |