Вопрос: Обнаружение текущего языка клавиатуры / имени макета на многоязычном компьютере


Я пытаюсь разработать приложение на C #, которое необходимо для обнаружения выбранного пользователем языка (раскладка клавиатуры). Однако на моем компьютере установлены два языка, код всегда возвращает значение по умолчанию, даже я меняю язык перед запуском приложения.

InputLanguage myCurrentLanguage = InputLanguage.InstalledInputLanguages[1]; // here I can see collection of languages 
InputLanguage myCurrentLanguage2 = InputLanguage.CurrentInputLanguage; // always return first or default one

Есть ли какой-либо метод определения реального выбранного / запущенного языка?


4


источник


Ответы:


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;

Этот поток на суперпользователе может пролить свет на проблему: Как избежать раскладки клавиатуры, автоматически меняющейся на окнах


7



Этот возвращает текущий активный язык ввода (тот, который в настоящее время относится к вашим типам клавиатуры):

InputLanguage myCurrentLang = InputLanguage.CurrentInputLanguage;

3



Вы можете получить это, позвонив GetKeyboardLayout  Функция Windows API.

Раскладка клавиатуры по потоку.

Я не знаю, есть ли встроенная управляемая версия этой функции.


1