Узнаём раскладку клавиатуры и язык ввода

Узнать текущую раскладку клавиатуры и язык ввода в программе можно следующими способами.

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

Первый способ узнать раскладку клавиатуры, состоит в использовании ряда функций WinAPI.

[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
);
/// <summary>
/// Вернёт Id раскладки в виде цифрового кода.
/// Например, 1049 (Русская) или 1033 (США) .
/// </summary>
private ushort GetKeyboardLayout()
{
    return GetKeyboardLayout(GetWindowThreadProcessId(GetForegroundWindow(), IntPtr.Zero));
}

Приведённый набор функций получает Id раскладки клавиатуры для активного окна (что в ряде случаев критично), но данный способ работоспособен только в среде Windows.

Второй способ использует стандартную .NET оболочку для текущего языка ввода.

keyBoardIdLbl.Text = InputLanguage.CurrentInputLanguage.LayoutName;

В данном варианте вместо Id раскладки выводится её название, которое отображается в соответствующих опциях системных настроек.

Язык ввода

Собственно, во втором способе получения раскладки клавиатуры мы уже работали с объектом InputLanguage, который содержал информацию о текущем языке ввода.

InputLanguage currentLanguage = InputLanguage.CurrentInputLanguage;

Содержимое класса InputLanguage достаточно подробно описано в документации Microsoft. В рамках статьи мы ограничимся лишь получением буквенного кода языка ввода (например, «ru-RU», «en-US» и т.д.).

CurrentInputLanguageLbl.Text = myCurrentLanguage.Culture.Name;

Стоит отметить, что класс InputLanguage поддерживается не только в «классическом» .NET Framework, но и в .NET Core (начиная с 3.0) и в .NET 5 RC 2. Что позволяет задействовать способы, основанные на его применении не только в «обычных» Windows программах.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *