СообЧа > База Знаний > Windows > Разное

Вопрос

Подскажите, плиз, как в VB/VBA с помощью API переключить раскладку клавиатуры (рус/англ). Желательно полный пример, а не только название API функции.

Ответ

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

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

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

Пример 1:

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
Пример 2:

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

Пример 3:

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



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