2015-01-02 3 views
2

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

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

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

+0

Просто обратите внимание, что этот код работает для меня, если вы меняете ввод с помощью t он языковой бар, в отличие от системного языка по умолчанию (который, похоже, не работает, но панель управления языком Windows 8 запутывает, поэтому я, возможно, не правильно настроил настройки) – Rhumborl

ответ

1

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

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

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

+0

Я думаю, что это не поддерживается в C#, оно принадлежит C++ – Shaahin

+0

См. Объявление interop, которое нужно использовать с C# в разделе комментариев на связанной странице. –

+1

@Shaahin Windows API не принадлежат ни одному языку. Вы можете получить доступ к не управляемым API, используя 'DllImport': http://www.webtropy.com/articles/art9-1.asp?f=GetKeyboardLayout – JLRishe

7

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

+0

Спасибо, Оливье, я попробовал, появляется ошибка, что CurrentCulture не существует в пространстве имен Threading. – Shaahin

+0

'System.Threading.Thread.CurrentCulture.TwoLetterISOLanguageName'. Или с помощью 'System.Threading',' just 'Thread.CurrentCulture.TwoLetterISOLanguageName'. –

+0

Этот пример посвящен культуре и получает значение по умолчанию, но мне нужен язык или клавиатура, которые могут быть разными. например: моя культура по умолчанию/клавиатура - английский, а второй - немецкий. Я хочу определить выбранную клавиатуру пользователем. – Shaahin

1

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

InputLanguage myCurrentLang = InputLanguage.CurrentInputLanguage; 
Смежные вопросы