Thread.CurrentThread.CurrentCulture.TwoLetterISOLanguageName
в пространстве имен System.Threading
возвращает то, что вы называете культурой по умолчанию, и не имеет отношения к раскладке клавиатуры. То есть на моем компьютере это возвращает "de"
, культуру, которую я использую для форматирования даты и числа. Тем не менее, я использую клавиатуру US-ASCII и .Culture.Name
и .LayoutName
от System.Windows.Forms.InputLanguage.CurrentInputLanguage
"en-US"
и "US"
соответственно.
Thread.CurrentThread.CurrentCulture
дает много дополнительной информации, как KeyboardLayoutId
, DisplayName
(локализованное название культуры), EnglishName
, DateTimeFormat
и многое другое.
Я сделал несколько тестов и заметил странное поведение. Я отобразил языковой бар Windows и выбрал вторичный язык ввода. Но всякий раз, когда я запускал небольшое приложение test-WinForms, язык ввода автоматически переключился на язык по умолчанию. После того, как приложение было запущено, я переключил язык ввода на вторичный. Теперь он остался до этого.
В обоих случаях это дало мне правильный язык ввода (один отображаемый на языковой панели):
lblInputLanguage.Text = InputLanguage.CurrentInputLanguage.Culture.Name;
lblKeyboardLayout.Text = InputLanguage.CurrentInputLanguage.LayoutName;
Эта нить на суперпользователя может пролить некоторый свет на эту проблему: How to avoid keyboard layout automatically changing on windows
Просто обратите внимание, что этот код работает для меня, если вы меняете ввод с помощью t он языковой бар, в отличие от системного языка по умолчанию (который, похоже, не работает, но панель управления языком Windows 8 запутывает, поэтому я, возможно, не правильно настроил настройки) – Rhumborl