InputLanguage не работает должным образом

Я хотел бы автоматически изменить раскладку клавиатуры и создать простое консольное приложение в Visual Basic, добавив следующее:

InputLanguage.CurrentInputLanguage = InputLanguage.FromCulture(New CultureInfo("ru"))

Но когда я компилирую этот код, он не меняет раскладку клавиатуры, поэтому он остается таким, каким он был до компиляции. Что я делаю неправильно?

1 ответ

Есть три способа изменить язык клавиатуры:

  1. Использование свойства .CurrentInputLanguage (только если установлен язык ввода)

    InputLanguage.CurrentInputLanguage = InputLanguage.FromCulture(New CultureInfo("ru-RU"))


  1. Использование свойства .CurrentCulture (только если установлен язык ввода)

    Dim culture = System.Globalization.CultureInfo.GetCultureInfo("ru-RU")
    Dim lang = InputLanguage.FromCulture(culture)
    
    If InputLanguage.InstalledInputLanguages.IndexOf(lang) >= 0 Then
        InputLanguage.CurrentInputLanguage = InputLanguage.InstalledInputLanguages(InputLanguage.InstalledInputLanguages.IndexOf(lang))
        System.Threading.Thread.CurrentThread.CurrentCulture = culture
    End If
    

  1. Использование функции winapi .LoadKeyboardLayout (медленно работает, даже если язык ввода не установлен)

    <DllImport("user32.dll")>
    Private Shared Function LoadKeyboardLayout(ByVal pwszKLID As String, ByVal Flags As UInteger) As IntPtr
    End Function
    
    LoadKeyboardLayout("00000419", 1)
    

дополнительный

Для проверки текущей культуры:

InputLanguage.CurrentInputLanguage.Culture.Name

Проверьте, установлен ли язык ввода:

InputLanguage.InstalledInputLanguages.IndexOf(InputLanguage.FromCulture(New CultureInfo("ru-RU"))

Переключиться на следующий идентификатор локали (раскладка клавиатуры):

Declare Function ActivateKeyboardLayout Lib "user32" (ByVal HKL As Integer, ByVal flags As Integer) As Integer 

'switch keyboard layout to next
Sub SwitchKeyboardLayout()
    Dim HKL_NEXT As Integer = 1
    Dim dl As Integer = ActivateKeyboardLayout(HKL_NEXT, 0)
    If dl = 0 Then MsgBox("Unsuccessful!")
End Sub

Дополнительные материалы

Другие вопросы по тегам