СообЧа > База Знаний > Программирование > Win32 API

Вопрос

Подскажите плиз как в VB/VBA с помощью API переключить раскладку клаиватуры

(рус/англ)

Желательно полный пример, а не только название API функции.

Ответ

Для работы с раскладкой клавиатуры в VB используются три основные API-функции:

1. GetKeyboardLayout — функция GetKeyboardLayout определяет текущую раскладку клавиатуры. Если idThread равен нулю, тогда возвращается текущяя раскладка клавиатуры для данного процесса. idThread — определяет процесс (приложение). В случае верного выполнения функции возвращаемое значение — идентификатор языка(раскладка клавиатуры).

Declare Function GetKeyboardLayout Lib «user32» (ByVal IdThread As Long) As

Long.

Пример:

Private Declare Function GetKeyboardLayout Lib "user32" (ByVal dwLayout As Long) As Long Private Declare Function GetWindowThreadProcessId& Lib "user32" (ByVal hwnd As Long, lpdwProcessId As Long) As Long ' Определяет текущую раскладку клавиатуры (для данного процесса) Dim L_HKL As Long L_CHKL = GetKeyboardLayout(0) ' Определяет раскладку клавиатуры для окна другого процесса Dim hAppWnd As Long Dim ThreadID As Long Dim ThreadLayout As Long hAppWnd = FindWindow(vbNullString, "Безымянный — Блокнот") If hAppWnd = 0 Then MsgBox "Окно не найдено!" Else ThreadID = GetWindowThreadProcessId(hAppWnd, ByVal 0&) ThreadLayout = GetKeyboardLayout(ThreadID) MsgBox "Раскладка " & Hex(ThreadLayout) End If

2. ActivateKeyboardLayout — функция устанавливает идентификатор языка для текущего процесса/программы. Идентификатор языка определяет язык а также физическое размещение клавиатуры. hKL — идентификатор языка, который будет активизирован (для Windows 9х этот аргумент может быть получен при помощи LoadKeyboardLayout либо при помощи констант, приведенных ниже, для Windows NT/2k — идентификатор языка должен быть сначала загружен запросом к функции LoadKeyboardLayout). Этот аргумент должен быть либо ссылкой на клавиатурную раскладку, либо одним из следующих значений: HKL_NEXT — выбирает следующую раскладку языка (из списка языков, установленных в системе);

HKL_PREV — выбирает предыдущую раскладку языка (из списка языков, установленных в системе). Flags — Определяют различные аргументы активизации языка. Этими аргументами могут быть одни из следующих значений : KLF_REORDER, KLF_RESET, KLF_SETFORPROCESS, KLF_SHIFTLOCK, KLF_UNLOADPREVIOUS. К сожалению не могу описать значения этих констант (займет очень много места). Лучше поищи в справочнике WinApi.

Declare Function ActivateKeyboardLayout Lib "user32" (ByVal HKL As Long, ByVal Flags As Long) As Long Пример: Private Const KL_NAMELENGTH As Long = 9 Private Const HKL_NEXT As Long = 1 Private Const HKL_PREV As Long = 0 Private Declare Function ActivateKeyboardLayout Lib "user32" (ByVal HKL As Long, ByVal Flags As Long) As Long Private Declare Function GetKeyboardLayout Lib "user32" (ByVal dwLayout As Long) As Long Private Declare Function GetKeyboardLayoutName Lib "user32" Alias "GetKeyboardLayoutNameA" (ByVal pwszKLID As String) As Long Dim lC_HKL As Long Dim sC_Buffer As String Dim lS_HKL As Long Dim sS_Buffer As String ' Определяет текущую раскладку клавиатуры lC_HKL = GetKeyboardLayout(0) ' Создает буфера sC_Buffer = String(KL_NAMELENGTH — 1, 0) sS_Buffer = String(KL_NAMELENGTH — 1, 0) ' Отыскивает текущее название раскладки клавиатуры GetKeyboardLayoutName s_Buffer ' Переключается на следующую клавиатурную раскладку ActivateKeyboardLayout HKL_NEXT, 0 ' Отыскивает переключенную клавиатурную раскладку lS_HKL = GetKeyboardLayout(0) ' Возвращает название переключенной клавиатурной раскладки GetKeyboardLayoutName sS_Buffer MsgBox "Клавиатурная раскладка была переключена" & vbCrLf & "с " & sC_Buffer & "на " & sS_Buffer ' Возвращение иходной раскладки клавиатуры ActivateKeyboardLayout lC_HKL, 0

3. API функция GetKeyboardLayoutName, позволяющая узнать не просто идентификатор раскладки, а конкретное имя текущей раскладки.

Declare Function GetKeyboardLayoutName Lib «user32» Alias

"GetKeyboardLayoutNameA» (ByVal pwszKLID As String) As Long

Пример:

Dim l_HKL As Long

Dim s_Buffer As String

Private Const KL_NAMELENGTH As Long = 9

' Определяет текущую раскладку клавиатуры

l_HKL = GetKeyboardLayout(0)

s_Buffer = String(KL_NAMELENGTH — 1, 0)

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

GetKeyboardLayoutName sCurrent_Buffer

MsgBox «Клавиатурная раскладка -" & s_Buffer

Из конференции Expert_FAQ



Copyright © 2000-2004 Сообщество Чайников
Контактная информация