Господа, подскажите!
Проблема со сменой рскладки клавиатуры.
В окошке ввода пароля придумал гениальную вещь (потом такое же увидел в XP ;).
Повесил на форму Label, где отображается раскладка (Ru или En).
По ней можно кликнуть и раскладка будет меняться.
Соответственно код формы такой:
'=================================================================================
Const HKL_NEXT = 1
Const KLF_REORDER = &H8
Private Sub Label_Click()
' Смена раскладки
ChangeKeyboardLayout
' Получение текущей раскладки
Label.Caption = KeyboardLayout
End Sub
' Смена раскладки
Public Sub ChangeKeyboardLayout()
Call ActivateKeyboardLayout(HKL_NEXT, KLF_REORDER)
End Sub
' Определение раскладки клавиатуры
Public Function KeyboardLayout() As String
' Возвращает Английская, если текущая раскладка английская
' Русская, если текущая раскладка русская
Dim lngTemp As Long 'Временная переменная
lngTemp = ActivateKeyboardLayout(67699721, 0)
ActivateKeyboardLayout lngTemp, 0
If lngTemp = 67699721 Then KeyboardLayout = "En" Else KeyboardLayout = "Ru"
End Function
'=================================================================================
Соответственно возникло две проблемы.
ПРОБЛЕМА 1. Как узнать, что юзер изменил раскладку,
например, нажатием Alt+Shift или кликом по
индикатору на панели задач?
Здесь придумал определять раскладку по таймеру - но это же несерьезно!
ПРОБЛЕМА 2. Как оказалось при тестировании на других машинах, код не всегда работает -
например, если в свойствах клавиатуры стоит раскладка не "США (101 клавиша)",
а "США (международная)" или что-то в этом духе.
Кстати, а почему ты считаешь таймер таким несерьезным?
Кстати, вот откопал у себя код
Функция та же, но выглядит аккуратнее.
' Декларация функций и констант АПИ
Declare Function ActivateKeyboardLayout Lib "user32" _
 ByVal HKL As Long, ByVal flags As Long) As Long
Public Const kb_lay_ru As Long = 68748313
Public Const kb_lay_en As Long = 67699721
' Переключить на русский язык
x = ActivateKeyboardLayout&kb_lay_ru, 0)
' Переключить на английский язык
x = ActivateKeyboardLayout&kb_lay_en, 0)
Мдя. С таймером вообще-то должно выглядеть так, как тут
http://vbp.com.ru/codes.sep#KeyLov
Лучше поставь таймер, саб-классинг часто вылетает.
Private Function GetLanguageInfo(ByVal hwnd As Long) As String
'Возвращает раскладку в указаном окне по hWnd
Dim sReturn As String, nRet As Long
Dim pID As Long, tId As Long, LCID As Long
tId = GetWindowThreadProcessId(hwnd, pID)
LCID = LoWord(GetKeyboardLayout(tId))
sReturn = String$(128, 0)
nRet = GetLocaleInfo(LCID, LOCALE_SENGLANGUAGE, sReturn, Len(sReturn))
If nRet > 0 Then GetLanguageInfo = Left$(sReturn, nRet - 1)
End Function
Private Function LoWord(DWORD As Long) As Integer
If DWORD And &H8000& Then
LoWord = &H8000 Or (DWORD And &H7FFF&
Else
LoWord = DWORD And &HFFFF&
End If
End Function