Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 |

 

  Вопрос: Проблемы с определением раскладки клавиатуры Добавлено: 17.07.05 11:40  

Автор вопроса:  mynog
Господа, подскажите!
Проблема со сменой рскладки клавиатуры.
В окошке ввода пароля придумал гениальную вещь (потом такое же увидел в 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 клавиша)",
            а "США (международная)" или что-то в этом духе.

Подскажите, какой код будет корректным?

Ответить

  Ответы Всего ответов: 8  

Номер ответа: 1
Автор ответа:
 GSerg



Вопросов: 0
Ответов: 1876


 Профиль | | #1 Добавлено: 17.07.05 13:14
1. Ловить WM_INPUTLANGCHANGE.
2. При клике по лейблу вызывать ActivateKeyboardLayout HKL_NEXT

Ответить

Номер ответа: 2
Автор ответа:
 mynog



Вопросов: 3
Ответов: 42
 Профиль | | #2 Добавлено: 19.07.05 23:50
GSerg Thank!
По второму вроде понял, а как
"1. Ловить WM_INPUTLANGCHANGE" ?
Подскажи, будь человеком ;)

Ответить

Номер ответа: 3
Автор ответа:
 GSerg



Вопросов: 0
Ответов: 1876


 Профиль | | #3 Добавлено: 20.07.05 05:44
Сабклассинг - слово говорит о чём-нибудь? :)

Ответить

Номер ответа: 4
Автор ответа:
 mynog



Вопросов: 3
Ответов: 42
 Профиль | | #4 Добавлено: 21.07.05 11:13
Я так и думал! :))
Слово-то знакомое, а вот с реализацией туго.
Ладно, будем искать... :)

Ответить

Номер ответа: 5
Автор ответа:
 someone



Вопросов: 215
Ответов: 1596
 Web-сайт: 123
 Профиль | | #5
Добавлено: 21.07.05 12:09
Кстати, а почему ты считаешь таймер таким несерьезным?
Кстати, вот откопал у себя код ;)
Функция та же, но выглядит аккуратнее.

   ' Декларация функций и констант АПИ
   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
Лучше поставь таймер, саб-классинг часто вылетает.

Ответить

Номер ответа: 6
Автор ответа:
 mynog



Вопросов: 3
Ответов: 42
 Профиль | | #6 Добавлено: 21.07.05 14:29
2Empro - спасибо за код и ссылку.
Пока не разберусь с сабклассингом, буду юзать таймер

Ответить

Номер ответа: 7
Автор ответа:
 someone



Вопросов: 215
Ответов: 1596
 Web-сайт: 123
 Профиль | | #7
Добавлено: 21.07.05 14:32
2mynog,
да не за что благодарить.
всегда приятно давать людям ссылку с своего сайта (ведь www2.pp.ru как обозначено выше только один из доменов) ;)

Ответить

Номер ответа: 8
Автор ответа:
 HACKER


 

Разработчик Offline Client

Вопросов: 236
Ответов: 8362
 Профиль | | #8 Добавлено: 21.07.05 15:50

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


API сам понаходи, мне влом.

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам