LoadKeyboardLayout не изменяет пользовательский интерфейс экранной клавиатуры.

Я активировал экранную клавиатуру Windows для своего приложения и изменил раскладку клавиатуры на тамильский перед отображением экранной клавиатуры, используя следующий код:

Private Const KLF_ACTIVATE As Integer = 1
Dim oskProcess As System.Diagnostics.Process

Private Sub ProdNameText_GotFocus(ByVal sender As Object, ByVal e As System.EventArgs) Handles ProdNameText.GotFocus
        LoadKeyboardLayout("00000449", KLF_ACTIVATE)
        oskProcess = Process.Start("osk.exe") 
End Sub

Я могу ввести тамильский язык в текстовое поле:

  • Нажатие клавиш на моей клавиатуре
  • Нажатие клавиш на экранной клавиатуре

Но экранная клавиатура отображает символы только на английском языке. Когда я нажимаю «Тамильский язык» на языковой панели, клавиши на экранной клавиатуре показывают символы тамильского языка.

Почему символы экранной клавиатуры не меняются в соответствии с изменением текущей раскладки клавиатуры, когда изменение делается программно?


person Lenin Raj Rajasekaran    schedule 26.01.2013    source источник


Ответы (1)


Это потому, что раскладка клавиатуры является свойством каждого процесса. Вы изменили раскладку клавиатуры только для своего процесса, а не для osk.exe.

Нет функции winapi для изменения раскладки клавиатуры для другого процесса. Учитывая, что языковая панель знает, как это сделать, это только намекает на то, что это возможно, но это довольно хорошо держится в секрете. Языковая панель управляется API-интерфейсом Text Services Framework (ItfLangBarMgr и др.), довольно неприятным API-интерфейсом, который довольно сложно использовать из управляемого кода. Беглый взгляд не показывает ни одного метода интерфейса, который явно поддерживает изменение макета. Вероятно, лучший намек на то, что это сложно/невозможно, заключается в том, что osk.exe этого не делает, а функция, которую вы ожидаете, будет иметь. Я должен порекомендовать вам придерживаться языковой панели.

person Hans Passant    schedule 26.01.2013