какая раскладка клавиатуры включена в активном окне ?

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
dasker
Новичок
Новичок
 
Сообщения: 39
Зарегистрирован: 01.10.2003 (Ср) 4:37

какая раскладка клавиатуры включена в активном окне ?

Сообщение dasker » 27.03.2005 (Вс) 15:34

есть код

Код: Выделить всё
Private Declare Function GetKeyboardLayoutName Lib "user32" Alias "GetKeyboardLayoutNameA" (ByVal pwszKLID As String) As Long

-------------------------

Код: Выделить всё
Dim KeybLayoutName As String
KeybLayoutName = String(9, 0)
GetKeyboardLayoutName KeybLayoutName
www = CStr(CLng(Left$(KeybLayoutName, InStr(1, KeybLayoutName, Chr(0)) - 1)))


всё прекрасно работает, но только если форма, в которой выполняется код активна, как только фокус пропадает, все...

как определять основную раскладку, в активном окне,короче говоря, как в трее переключатель.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 27.03.2005 (Вс) 15:54

Находим активное окно через getforegroundwindow. Потом getwindowthreadprocessid, узнаём tID. Потом getkeyboardlayout(tID).
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

dasker
Новичок
Новичок
 
Сообщения: 39
Зарегистрирован: 01.10.2003 (Ср) 4:37

Сообщение dasker » 28.03.2005 (Пн) 22:22

а с примером можно поподробнее, я с api не очень дружу.
заранее благодарю :)

GM
programador
programador
 
Сообщения: 1427
Зарегистрирован: 24.06.2003 (Вт) 15:56
Откуда: 194.67.52.100

Сообщение GM » 29.03.2005 (Вт) 7:08

Вот так:
Код: Выделить всё
Private Declare Function GetKeyboardLayout Lib "user32" ( _
    ByVal dwLayout As Long) As Long
Private Declare Function GetForegroundWindow Lib "user32" () As Long
Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As Long, lpdwProcessId As Long) As Long
Private Declare Function GetKeyboardLayout Lib "user32" ( _
    ByVal dwLayout As Long) As Long
sub main()
dim pid as long
call getwindowthreadprocessid(getforegroundwindow,pid)
msgbox getkeyboardlayout(pid)
end sub
الفيجوال بيسك الرابح

Sur
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 91
Зарегистрирован: 14.07.2003 (Пн) 20:54
Откуда: C2H5OH

Сообщение Sur » 29.03.2005 (Вт) 9:58

Это работает, если юзер в активном консольном окне?

kif
Постоялец
Постоялец
 
Сообщения: 736
Зарегистрирован: 10.12.2001 (Пн) 18:06
Откуда: Украина, Одесса

Сообщение kif » 29.03.2005 (Вт) 12:08

GM писал(а):Вот так:
Код: Выделить всё
Private Declare Function GetKeyboardLayout Lib "user32" ( _
    ByVal dwLayout As Long) As Long
Private Declare Function GetForegroundWindow Lib "user32" () As Long
Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As Long, lpdwProcessId As Long) As Long
Private Declare Function GetKeyboardLayout Lib "user32" ( _
    ByVal dwLayout As Long) As Long
sub main()
dim pid as long
call getwindowthreadprocessid(getforegroundwindow,pid)
msgbox getkeyboardlayout(pid)
end sub


а где найти соответствие возвращаемого значения и языка (RUS ENG и т.д.) :?:
Братья и сестры, что вы делаете???
Ведь вы же братья и сестры.

dasker
Новичок
Новичок
 
Сообщения: 39
Зарегистрирован: 01.10.2003 (Ср) 4:37

Сообщение dasker » 29.03.2005 (Вт) 20:27

GM писал(а):Вот так:
Код: Выделить всё
Private Declare Function GetKeyboardLayout Lib "user32" ( _
    ByVal dwLayout As Long) As Long
Private Declare Function GetForegroundWindow Lib "user32" () As Long
Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As Long, lpdwProcessId As Long) As Long
Private Declare Function GetKeyboardLayout Lib "user32" ( _
    ByVal dwLayout As Long) As Long
sub main()
dim pid as long
call getwindowthreadprocessid(getforegroundwindow,pid)
msgbox getkeyboardlayout(pid)
end sub



msgbox выводит 0 в любом случае, может я что ни то делаю код ниже
Код: Выделить всё
Public Declare Function GetKeyboardLayout Lib "user32" ( _
    ByVal dwLayout As Long) As Long
Public Declare Function GetForegroundWindow Lib "user32" () As Long
Public Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As Long, lpdwProcessId As Long) As Long

Sub main()
Dim pid As Long
Call GetWindowThreadProcessId(GetForegroundWindow, pid)
MsgBox GetKeyboardLayout(pid)
End Sub


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот, Yandex-бот и гости: 151

    TopList