Название раскладки клавиатуры

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

Название раскладки клавиатуры

Сообщение arthur2 » 07.02.2008 (Чт) 0:16

Как получить название раскладки клавиатуры? То есть, "Русская, Русская (машинопись)", "США по Двораку", "Испанская (традиционная сортировка)" и т.д.

Ну ладно -- никто не знает. Но хоть какую-нибудь зацепку предложите! Куда рыть?

GetKeyboardLayout(0) -- узнаём раскладку
GetKeyboardLayoutName -- узнаём идентификатор
GetLocaleInfo -- узнаём название языка.

А название раскладки -- как?
Последний раз редактировалось arthur2 09.02.2008 (Сб) 22:03, всего редактировалось 1 раз.

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 07.02.2008 (Чт) 7:57

Разве что по получаемым идентификаторам вручную получать названия из заранее созданного массива? Но, ИМХО, это не решение.
Весь мир матрица, а мы в нем потоки байтов!

Vi
Постоялец
Постоялец
 
Сообщения: 739
Зарегистрирован: 25.01.2002 (Пт) 11:03
Откуда: Россия, Ижевск

Сообщение Vi » 07.02.2008 (Чт) 9:08

Посмотри HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layouts. Я не знаю АПИ, которое перечисляет эти значения, но, наверное, можно и самому прочитать.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! (с) КВН

Atoman
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 109
Зарегистрирован: 01.02.2008 (Пт) 6:36

Сообщение Atoman » 07.02.2008 (Чт) 10:03

Вот это тея устроит:

Код: Выделить всё
'1024 = Process Default Language
'1030 = Danish
'1031 = German (Standard)
'1032 = Greek
'1033 = English (United States)
'2057 = English (United Kingdom)
'3081 = English (Australian)
'4105 = English (Canadian)
'5129 = English (New Zealand)
'6153 = English (Ireland)
'7177 = English (South Africa)
'8201 = English (Jamaica)
'9225 = English (Caribbean)
'10249 = English (Belize)
'11273 = English (Trinidad)
'1034 = Spanish (Traditional Sort)
'3082 = Spanish (Modern Sort)
'1035 = Finnish
'1036 = French (Standard)
'1040 = Italian (Standard)
'1043 = Dutch (Standard)
'2067 = Dutch (Belgian)
'1044 = Norwegian (Bokmal)
'2068 = Norwegian (Nynorsk)
'1045 = Polish
'2070 = Portuguese (Standard)
'1049 = Russian

Private Declare Function VerLanguageName Lib "kernel32" Alias "VerLanguageNameA" (ByVal wLang As Long, ByVal szLang As String, ByVal nSize As Long) As Long
Private Declare Function GetSystemDefaultLangID Lib "kernel32" () As Integer

Private Sub Command1_Click()
Dim LangID As Long
Dim strName As String, Buffer As String
    Buffer = String(255, 0)
    LangID = GetSystemDefaultLangID
    VerLanguageName LangID, Buffer, Len(Buffer)
    Buffer = Left$(Buffer, InStr(1, Buffer, Chr$(0)) - 1)
    MsgBox Buffer
End Sub


Код: Выделить всё
Option Explicit

'Written by SCINER: lenar2003@mail.ru

Private Const LOCALE_SENGLANGUAGE = &H1001  'English name of language
Private Const LOCALE_SNATIVECTRYNAME = &H8  '  native name of country
Private Const LOCALE_SNATIVELANGNAME = &H4  '  native name of language
Private Const LOCALE_SSHORTDATE = &H1F      '  short date format string
Private Const LOCALE_STIMEFORMAT = &H1003   '  time format string
Private Const LOCALE_ICOUNTRY = &H5         '  country code
Private Const LOCALE_IDEFAULTLANGUAGE = &H9 '  default language id
Private Const LOCALE_ILANGUAGE = &H1        '  language id
Private Const LOCALE_SABBREVCTRYNAME = &H7  '  abbreviated country name
Private Const LOCALE_SCOUNTRY = &H6         '  localized name of country

Private Declare Function GetSystemDefaultLangID Lib "kernel32" () As Integer
Private Declare Function GetLocaleInfo Lib "kernel32" Alias "GetLocaleInfoA" (ByVal Locale As Long, ByVal LCType As Long, ByVal lpLCData As String, ByVal cchData As Long) As Long

Private Sub Form_Load()

  Dim lLocal As Long
  lLocal = GetSystemDefaultLangID
  Print lLocal
  Print LocalInfo(lLocal, LOCALE_SENGLANGUAGE)
  Print LocalInfo(lLocal, LOCALE_SNATIVELANGNAME)
  Print LocalInfo(lLocal, LOCALE_SNATIVECTRYNAME)
  Print LocalInfo(lLocal, LOCALE_SCOUNTRY)
  Print LocalInfo(lLocal, LOCALE_SSHORTDATE)
  Print LocalInfo(lLocal, LOCALE_STIMEFORMAT)

  Print LocalInfo(lLocal, LOCALE_IDEFAULTLANGUAGE)
  Print LocalInfo(lLocal, LOCALE_ILANGUAGE)
  Print LocalInfo(lLocal, LOCALE_SABBREVCTRYNAME)

End Sub

Function LocalInfo(ByVal lLocal As Long, ByVal LocalInfoEnum As Long) As String
  Dim Tmp As String
  Dim lRet As Long
  Tmp = Space(128)
  Call GetLocaleInfo(lLocal, LocalInfoEnum, Tmp, Len(Tmp))
  lRet = InStr(Tmp, vbNullChar)
  If lRet > 0 Then Tmp = Left(Tmp, lRet - 1)
  LocalInfo = Tmp
End Function

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Сообщение arthur2 » 07.02.2008 (Чт) 15:04

Ну вот, теперь уже теплее. Спасибо!

for Viper. Это, конечно, не решение, но с другой стороны -- я думаю, всех возможных вариантов оказалось бы не так уж много. Так что в принципе такой вариант меня бы устроил. Вопрос в том, где взять более-менее полную таблицу таких соответствий?

for Atoman. Спасибо, но этот вариант не подходит. До него я уже докопался: http://bbs.vbstreets.ru/viewtopic.php?t=35655Очень удобно - можно узнать и язык, и страну и кодовую страницу и очень много ещё чего... Но названия раскладки -- увы.

for Vi. А вот это как раз -- то что надо!

В связи с чем ещё несколько вопросов:

1. HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layouts Начиная с какой винды появилась эта ветка реестра? Есть ли она в Вин98? Если не трудно -- у кого под боком эта винда -- взгляните, есть или нет?

2. Есть ли у кого винда на английском -- можете мне сэкспортировать эту ветку в reg-файл? Хочется получить все названия на английском -- составить-таки таблицу соответствий.

3. Как раз через реестр узнал, что названия живут в input.dll в качестве ресурсов. Раз они там, наверное, можно как-то попросить эту библиотеку, чтобы она сама их выдала? Или нельзя?

Vi
Постоялец
Постоялец
 
Сообщения: 739
Зарегистрирован: 25.01.2002 (Пт) 11:03
Откуда: Россия, Ижевск

Сообщение Vi » 07.02.2008 (Чт) 17:37

arthur2 писал(а):1. HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layouts Начиная с какой винды появилась эта ветка реестра? Есть ли она в Вин98? Если не трудно -- у кого под боком эта винда -- взгляните, есть или нет?

HOWTO: How to Find the Available Keyboard Layouts Under Windows NT

Q139571

--------------------------------------------------------------------------------
The information in this article applies to:

Microsoft Win32 Software Development Kit (SDK), used with:
Microsoft Windows NT Server version 3.51
Microsoft Windows NT Workstation version 3.51
Microsoft Windows 4.0
Microsoft Windows 95
the operating system: Microsoft Windows 2000
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! (с) КВН


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

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

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

    TopList