Форум программистов, компьютерный форум, киберфорум
VBScript/JScript/WSH/WMI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/22: Рейтинг темы: голосов - 22, средняя оценка - 5.00
5472 / 1150 / 50
Регистрация: 15.09.2012
Сообщений: 3,576

Список установленных языков и раскладок клавиатуры

22.05.2013, 11:16. Показов 4430. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Как с помощью какой-нибудь библиотеки, связанной с "Shell" или "Script", получить список всех установленных на компьютере языков и раскладок клавиатуры?

Например, можно получить список всех установленных принтеров. Может быть можно получить список языков и раскладок клавиатуры?


Пояснения модераторам и участникам Форума
  1. Мой вопрос не связан с VBA никаким образом, хоть я и сижу в разделе VBA. Не нужно переносить эту тему в раздел "VBA" и писать, что там и так всё это делается без "Shell" и "Script".
  2. Альтернативные способы не интересуют (использование средств самого языка "VBA", "API" и т.д.)
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
22.05.2013, 11:16
Ответы с готовыми решениями:

Где кроме реестра хранится список установленных приложений ?
По факту получается, что инсталятор может не занести данные в реестр.

Вывести список установленных драйверов или устройств, а также неустановленных устройств
Здравствуйте! Подскажите как можно вывести список установленных драйверов или устройств, а также не установленных устройств

Как получить список установленных языков в системе? И программно переключить язык ввода
Привет, ребят, необходимо узнать список языков, которые установлены в системе у пользователя (ubuntu) и добавить этот список в QMenu. И...

14
2619 / 549 / 109
Регистрация: 21.03.2012
Сообщений: 1,051
23.05.2013, 12:59
Что-нибудь такое?
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
Dim objReg, strKeyPath, arrSubKeys, i
Dim objFS, objFile, strList, strLog
Const HKLM = &H80000002
strLog = "Keyboard_Layouts.log"
On Error Resume Next
Set objReg = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv")
If Err.Number = 0 Then
    strKeyPath = "SYSTEM\CurrentControlSet\Control\Keyboard Layouts"
    objReg.EnumKey HKLM, strKeyPath, arrSubKeys
    If Err.Number = 0 Then
        For i = 0 To UBound(arrSubKeys)
            objReg.GetStringValue HKLM, strKeyPath & "\" & arrSubKeys(i), "Layout Text", strValue
            If Err.Number = 0 Then
                strList = strList & strValue & vbNewLine
            Else
                Err.Clear
            End If
        Next
        If Len(strList) > 0 Then
            Set objFS = CreateObject("Scripting.FileSystemObject")
            strLog = objFS.BuildPath(objFS.GetParentFolderName(WScript.ScriptFullName), strLog)
            Set objFile = objFS.CreateTextFile(strLog, True)
            objFile.Write strList
            objFile.Close
            Set objFile = Nothing
            Set objFS = Nothing
            WScript.Echo "Список создан."
        Else
            WScript.Echo "Список пуст."
        End If
    Else
        WScript.Echo "Ошибка " & Err.Number & vbNewLine & " при выполнении запроса."
        Err.Clear
    End If
Else
    WScript.Echo "Ошибка " & Err.Number & vbNewLine & " при подключении к WMI-пространству."
    Err.Clear
End If
Set objReg = Nothing
WScript.Quit 0
1
5472 / 1150 / 50
Регистрация: 15.09.2012
Сообщений: 3,576
23.05.2013, 15:48  [ТС]
Dmitrii, да, что-то такое я искал.

Только у вас не "Shell" и не "Script", а "WMI" (другое название "WBEM").

Т.е. смысл - прочитать данные о раскладках из реестра операционной системы "Windows".

По этому пути:
SYSTEM\CurrentControlSet\Control\Keyboar d Layouts

в реестре "Windows" что-то хранится похожее на раскладки, но у меня их там 164. А на самом деле я установил на компьютере только две раскладки: русскую и английскую. Значит нужно в другом месте смотреть.
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
23.05.2013, 17:27
Цитата Сообщение от Скрипт Посмотреть сообщение
Значит нужно в другом месте смотреть.
Посмотрите в HKEY_CURRENT_USER\Keyboard Layout\Preload
1
5472 / 1150 / 50
Регистрация: 15.09.2012
Сообщений: 3,576
23.05.2013, 17:51  [ТС]
Убежденный, вот так делаю, но не получается (в массиве "arrSubKeys" нет данных). И в самом реестре я посмотрел - в реестре очень мало данных по раскладкам: должны быть числа из 8 цифр. А по этому пути есть числа, но там впереди нули, а должны быть другие числа. Видимо нужен другой путь.

Код
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
Sub Procedure_1()
 
    Const HKEY_CARRENT_USER As Long = &H80000001
    Const myKeyPath = "Keyboard Layout\Preload"
    
    Dim objReg As Object
    Dim arrSubKeys() As String
    Dim subkey As Variant
    Dim i As Long
    
    
    'Создаём объект "StdRegProv", с помощью которого
        'попробуем взять данные из реестра операционной системы "Windows".
    'Даём имя "objReg" этому объекту. Через это имя будем
        'обращаться к этому объекту.
    Set objReg = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & _
        ".\root\default:StdRegProv")
    
    'Получаем данные из реестра операционной системы "Windows".
        'Данные помещаем в массив "arrSubKeys".
    objReg.EnumKey HKEY_CARRENT_USER, myKeyPath, arrSubKeys
    
    'Просматриваем массив "arrSubKeys".
    For i = 0 To UBound(arrSubKeys) Step 1
        'Вывод результата в View - Immediate Window.
        Debug.Print arrSubKeys(i)
    Next i
 
End Sub
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
23.05.2013, 17:59
Цитата Сообщение от Скрипт Посмотреть сообщение
И в самом реестре я посмотрел - в реестре очень мало данных по раскладкам.
Ну вот например, у меня в системе две раскладки - русская и английская.
В ключе реестра, который я приводил выше, находятся две записи типа REG_SZ со
значениями 00000409 и 00000419. 409 - это "English - United States", а 419 - "Russian".
1
5472 / 1150 / 50
Регистрация: 15.09.2012
Сообщений: 3,576
23.05.2013, 18:03  [ТС]
Убежденный, у меня так же, но мне нужны вот такие числа:
67699721 (английский язык);
68748313 (русский язык).

Первые четыре цифры обозначают язык, а вторе четыре цифры - раскладку.
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
23.05.2013, 18:16
А где Вы взяли именно эти числа ? Они кажутся "взятыми с потолка"...
http://msdn.microsoft.com/en-u... 64664.aspx
0
5472 / 1150 / 50
Регистрация: 15.09.2012
Сообщений: 3,576
23.05.2013, 18:21  [ТС]
Убежденный, в VBA-Word и в API-функции "GetKeyboardLayoutList".
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
23.05.2013, 19:33
Скрипт, вот результат работы GetKeyboardLayoutList на моем компьютере:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <iostream>
#include <Windows.h>
 
 
 
int main()
{
    using namespace std;
 
    int const NumLayouts = GetKeyboardLayoutList(0, NULL);
 
    if (0 == NumLayouts)
    {
        cerr << "GetKeyboardLayoutList failed (1)." << endl;
        return EXIT_FAILURE;
    }
 
    HKL *pKbdLayBuffer = new HKL[NumLayouts];
 
    if (NumLayouts != GetKeyboardLayoutList(NumLayouts, &pKbdLayBuffer[0]))
    {
        delete [] pKbdLayBuffer;
        cerr << "GetKeyboardLayoutList failed (2)." << endl;
        return EXIT_FAILURE;
    }
 
    for (int i = 0; i < NumLayouts; ++i)
    {
        cout << hex << pKbdLayBuffer[i] << endl;
    }
 
    delete [] pKbdLayBuffer;
    return EXIT_SUCCESS;
}
04190419
04090409
0
5472 / 1150 / 50
Регистрация: 15.09.2012
Сообщений: 3,576
23.05.2013, 20:09  [ТС]
Убежденный, у меня в сообщении #7 числа в десятичной системе счисления, а вы перевели в шестнадцатеричную систему счисления.
0
2619 / 549 / 109
Регистрация: 21.03.2012
Сообщений: 1,051
24.05.2013, 10:04
Скрипт, я бы "состряпал" что-нибудь подобное:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
Sub Example()
Dim objReg As Object, strKeyPath As String, arrNames(), arrTypes()
Dim strList As String, strValue As String
Const HKCU = &H80000001
Const HKLM = &H80000002
 
On Error Resume Next
Set objReg = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv")
If Err.Number = 0 Then
    strKeyPath = "Keyboard Layout\Preload"
    objReg.EnumValues HKCU, strKeyPath, arrNames, arrTypes
    If Err.Number = 0 Then
        ReDim arrTypes(UBound(arrNames))
        For i = 0 To UBound(arrNames)
            objReg.GetStringValue HKCU, strKeyPath, arrNames(i), strValue
            If Err.Number = 0 Then
                strList = strList & strValue & vbNewLine
                arrTypes(i) = strValue
            Else
                Err.Clear
            End If
        Next
        If Len(strList) > 0 Then
            MsgBox strList, vbInformation, "Список кодов раскладок"
            strList = vbNewLine
            strKeyPath = "SYSTEM\CurrentControlSet\Control\Keyboard Layouts"
            For i = 0 To UBound(arrTypes)
                objReg.GetStringValue HKLM, strKeyPath & "\" & arrTypes(i), "Layout Text", strValue
                strList = strList & strValue & " [ " & arrTypes(i) & " ]" & vbNewLine
            Next
            If Len(strList) > 0 Then
                MsgBox strList, vbInformation, "Список  наименований и кодов раскладок"
            Else
                MsgBox "Список наименований и кодов раскладок пуст.", vbExclamation
            End If
        Else
            MsgBox "Список кодов раскладок пуст.", vbExclamation
        End If
    Else
        MsgBox "Ошибка " & Err.Number & vbNewLine & " при выполнении запроса.", vbCritical
        Err.Clear
    End If
Else
    MsgBox "Ошибка " & Err.Number & vbNewLine & " при подключении к WMI-пространству.", vbCritical
    Err.Clear
End If
Set objReg = Nothing
End Sub
1
5472 / 1150 / 50
Регистрация: 15.09.2012
Сообщений: 3,576
24.05.2013, 11:14  [ТС]
Переделал код из сообщения #12, чтобы было легче понять код. Числа-идентификаторы раскладок будут получены в шестнадцатеричном виде. Если эти числа-идентификаторы где-то понадобится использовать, то можно их переделать в другую систему счисления.

Код
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
Sub Example()
 
    Dim myStdRegProv As Object
    'У массива "arrParameters" должен быть тип данных "Variant",
        'иначе ошибка выскакивает.
    Dim arrParameters() As Variant, arrTypes() As Long
    Dim myValue As String
    Dim i As Long
    
    '1. В константе "HKCU" указываем число-идентификотор
        'ветки "HKCU" в реестре операционной системы "Windows".
    Const HKCU As Long = &H80000001
    
    '2. В константе "myFolder" указываем папку в ветке "HKCU",
        'где находится информация об установленных пользователем
        'раскладках клавиатуры.
    Const myFolder As String = "Keyboard Layout\Preload"
 
    '3. Создаём объект "StdRegProv". Объект "StdRegProv" является
        'объектом программы "WMI". С помощью этого объекта
        'получим доступ к реестру операционной системы "Windows".
    Set myStdRegProv = _
        GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv")
    
    '4. Получаем содержимое папки "Preload".
        'Данные из папки "Preload" помещаем в массив "arrParameters".
        'В массив "arrTypes" попадают типы данных параметров,
        'которые находятся в массиве "arrParameters". Нам
        'массив "arrTypes" не нужен. Он нужен только  для того,
        'чтобы можно было написать код (для синтаксиса).
    myStdRegProv.EnumValues HKCU, myFolder, arrParameters(), arrTypes()
    
    'С помощью цикла просматриваем все элементы в массиве "arrParameters".
    For i = 0 To UBound(arrParameters) Step 1
    
        '5. Берём данные из параметра в переменную "strValue".
        myStdRegProv.GetStringValue HKCU, myFolder, arrParameters(i), myValue
        
        '6. Выводим результат в View - Immediate Window (это в VBA).
        Debug.Print myValue
        
    Next i
 
End Sub
0
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18033 / 7736 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
25.05.2013, 03:03
Без WMI:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
    Option Explicit
    Dim objReg, WshShell: Set WshShell = CreateObject("WScript.Shell")
 
    Dim Preloaded()
    Dim Layout
    Dim n
 
    On Error Resume Next
    Do
        n = n + 1
        Layout = WshShell.RegRead("HKCU\Keyboard Layout\Preload\" & n)
        If Err.Number = 0 Then
            ReDim Preserve Preloaded(n - 1)
            Preloaded(n - 1) = Layout
        Else
            Exit Do
        End If
    Loop
    On Error GoTo 0
    
    Dim LangFullName(): ReDim LangFullName(UBound(Preloaded))
    Dim LangShortName(): ReDim LangShortName(UBound(Preloaded))
    
    For n = 0 To UBound(Preloaded)
        LangFullName(n) = WshShell.RegRead("HKLM\SYSTEM\CurrentControlSet\Control\Keyboard Layouts\" & Preloaded(n) & "\Layout Text")
        LangShortName(n) = WshShell.RegRead("HKLM\SYSTEM\CurrentControlSet\Control\Keyboard Layout\DosKeybCodes\" & Preloaded(n))
    Next
    
    Set WshShell = Nothing
    
    MsgBox Join(Preloaded, vbCrLf)
    MsgBox Join(LangFullName, vbCrLf)
    MsgBox Join(LangShortName, vbCrLf)
1
5472 / 1150 / 50
Регистрация: 15.09.2012
Сообщений: 3,576
25.05.2013, 08:11  [ТС]
Пункт 1

Сделал комментарии к коду из сообщения #14 и оставил фрагмент кода, который получает числа-идентификаторы раскладок:

Код
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
Sub Procedure_1()
 
    'Для работы кода нужно подключить библиотеку:
        'Tools - References... - Windows Script Host Object Model.
    Dim myWshShell As IWshRuntimeLibrary.WshShell
    Dim i As Long
    
    
    '1. Создаём объект "WshShell" и даём этому объекту VBA-имя
        '"myWshShell". Через это имя будем обращаться к этому объекту.
    Set myWshShell = CreateObject(Class:="WScript.Shell")
 
    'Если параметра с таким порядковым номером не будет,
        'то возникнет ошибка. Команда "On Error Resume Next"
        'позволит продолжить код, несмотря на ошибку.
    On Error Resume Next
        
    'С помощью цикла просматриваем параметры папки "Preload".
    Do
        '1. Параметры в папке "Preload" - это порядковые номера.
        'С помощью переменной "i" формируем порядковые номера.
        i = i + 1
        
        '2. Берём данные из реестра из папки "Preload" из
            'очередного параметра.
        'Вывод данных в View - Immediate Window (это в VBA).
        Debug.Print myWshShell.RegRead("HKCU\Keyboard Layout\Preload\" & i)
        
        'Если параметра в папке "Preload" не будет с таким
            'порядковым номером, то будет ошибка.
        If Err.Number <> 0 Then
            '3. Выходим из кода, т.к. все параметры просмотрены.
            Exit Sub
        End If
    Loop
    
    'Отключаем действие команды "On Error Resume Next" и
        'обнуляем объект "Err". В этом коде это не нужно,
        'т.к. код и так уже закончился, но если кто-то
        'будет добавлять код в этот код, то может забыть это сделать.
    On Error GoTo 0
    
End Sub



Пункт 2

Осталось теперь выяснить, как с помощью числа "00000409" переключить раскладку клавиатуры. Например, в VBA-Word вот так переключается раскладка клавиатуры на раскладку с русским языком:
Visual Basic
1
2
3
4
5
Sub Procedure_2()
 
    Application.Keyboard 68748313
 
End Sub
Как сюда подставить число "00000409"?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
25.05.2013, 08:11
Помогаю со студенческими работами здесь

Как получить список установленных языков в системе? И программно переключить язык ввода
Привет, ребят, необходимо узнать список языков, которые установлены в системе у пользователя (ubuntu) и добавить этот список в QMenu. И...

Номер раскладок клавиатуры
00000419 и 00000409 это понятно какого языка раскладка, а где можно посмотреть коды всех языков мира для делфи? Может не правильно вбиваю...

Файлы раскладок клавиатуры в ubuntu 14.10
Всем привет, если кто знает, подскажите пожалуйста где расположены файл раскладки русского языка. Я только одно место знаю где они...

Интересное поведение при переключении раскладок клавиатуры
Поставил Ubuntu 14.04 LTS. (До этого сто раз вообще Ubuntu ставил и юзал), но только сейчас столкнулся с такой проблемкой... Ситуация:...

Пропала возможность кнопочного переключения раскладок клавиатуры
С некоторых пор пропала возможность кнопочного (сочетание клавиш ктрл-шифт) переключения раскладок клавиатуры и языка ввода при работе с...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при создании или изменении элементов справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной записи электронной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru