Узнать текущую раскладку клавиатуры и язык ввода в программе можно следующими способами.
Раскладка клавиатуры
Первый способ узнать раскладку клавиатуры, состоит в использовании ряда функций WinAPI.
1 2 3 4 5 6 7 8 9 10 11 12 |
[DllImport("user32.dll", SetLastError = true)] static extern int GetWindowThreadProcessId( [In] IntPtr hWnd, [Out, Optional] IntPtr lpdwProcessId ); [DllImport("user32.dll", SetLastError = true)] static extern IntPtr GetForegroundWindow(); [DllImport("user32.dll", SetLastError = true)] static extern ushort GetKeyboardLayout( [In] int idThread ); /// |
1 2 3 4 |
private ushort GetKeyboardLayout() { return GetKeyboardLayout(GetWindowThreadProcessId(GetForegroundWindow(), IntPtr.Zero)); } |
Приведённый набор функций получает Id раскладки клавиатуры для активного окна (что в ряде случаев критично), но данный способ работоспособен только в среде Windows.
Второй способ использует стандартную .NET оболочку для текущего языка ввода.
1 |
keyBoardIdLbl.Text = InputLanguage.CurrentInputLanguage.LayoutName; |
В данном варианте вместо Id раскладки выводится её название, которое отображается в соответствующих опциях системных настроек.
Язык ввода
Собственно, во втором способе получения раскладки клавиатуры мы уже работали с объектом InputLanguage, который содержал информацию о текущем языке ввода.
1 |
InputLanguage currentLanguage = InputLanguage.CurrentInputLanguage; |
Содержимое класса InputLanguage достаточно подробно описано в документации Microsoft. В рамках статьи мы ограничимся лишь получением буквенного кода языка ввода (например, «ru-RU», «en-US» и т.д.).
1 |
CurrentInputLanguageLbl.Text = myCurrentLanguage.Culture.Name; |
Стоит отметить, что класс InputLanguage поддерживается не только в «классическом» .NET Framework, но и в .NET Core (начиная с 3.0) и в .NET 5 RC 2. Что позволяет задействовать способы, основанные на его применении не только в «обычных» Windows программах.
Добавить комментарий