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

340
01 февраля 2017, 23:22

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

[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 и.т.д

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

Answer 1
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));
}
READ ALSO
Как в C# правильно сравнивать строки

Как в C# правильно сравнивать строки

Как в C# правильно сравнивать строки: Equals или ==?

962
Посоветуйте книгу либо ресурс [дубликат]

Посоветуйте книгу либо ресурс [дубликат]

На данный вопрос уже ответили:

440
Как в codeception последовательно сделать клик по нескольким элементам с зажатым 'shift'

Как в codeception последовательно сделать клик по нескольким элементам с зажатым 'shift'

Добрый деньтребуется выделить несколько блоков кликнув по каждому, но при этом должен быть зажат shift, т

440
Ajax laravel 5.3

Ajax laravel 5.3

ЗдравствуйтеСовсем недавно начал учить фреймворк laravel 5

688