Как получить имя раскладки клавиатуры

GooliveR

Кусочек кода:

[DllImport("user32.dll", SetLastError = true)]
public static extern ushort GetKeyboardLayout([In] int idThread);
[DllImport("user32.dll", SetLastError = true)]
public static extern int GetWindowThreadProcessId([In] IntPtr hWnd,[Out, Optional] IntPtr lpdwProcessId);
[DllImport("user32.dll", SetLastError = true)]
public static extern IntPtr GetForegroundWindow();
public static string mss;

static ushort GetKeyboardLayout()
        {
            return GetKeyboardLayout(GetWindowThreadProcessId(GetForegroundWindow(), IntPtr.Zero));
        }

Теперь когда я пытаюсь получить раскладку клавиатуры

ushort lang = GetKeyboardLayout();
mss = lang.ToString();
TextBox1.Text = "Первоначальная раскладка: " + mss + "\n";

Он показывает не Rus или Eng а цифрами типо 1049 и.т.д

Как это исправить?

1 ответ

GooliveR

using System.Globalization;
int id = GetKeyboardLayout();
CultureInfo ci = CultureInfo.GetCultureInfo(id);
this.Text = id + " " + ci.ThreeLetterISOLanguageName + " " + ci.Name;

И там ещё много интересного есть.

Обратите внимание, что у вас неправильная сигнатура P/Invoke! Функция GetKeyboardLayout возвращает хэндл, поэтому правильная сигнатура такая:

[DllImport("user32.dll")]
static extern IntPtr GetKeyboardLayout(int idThread);

Согласно документации,

The low word contains a Language Identifier for the input language and the high word contains a device handle to the physical layout of the keyboard.

Поэтому нам нужно извлечь младшее слово:

static ushort GetKeyboardLayout()
{
    return (ushort)GetKeyboardLayout(GetWindowThreadProcessId(GetForegroundWindow(),
                                                              IntPtr.Zero));
}

licensed under cc by-sa 3.0 with attribution.