Кусочек кода:
[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
и.т.д
Как это исправить?
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));
}
Добрый деньтребуется выделить несколько блоков кликнув по каждому, но при этом должен быть зажат shift, т