Всем привет.
Требуется определить раскладку клавиатуры (rus/en) консольного приложения для Windows 10 (хотя бы тот же cmd.exe, который сама windows определяет легко):
![bb38f7622f404a819ebe68769803ed4b.png](https://habrastorage.org/web/bb3/8f7/622/bb38f7622f404a819ebe68769803ed4b.png)
Для windows 7/8/8.1 определял с помощью кода:
[DllImport("kernel32.dll")]
static extern bool FreeConsole();
[DllImport("kernel32.dll")]
static extern bool AttachConsole(int pid);
// http://forum.script-coding.com/viewtopic.php?id=5650
[DllImport("kernel32.dll")]
static extern bool GetConsoleKeyboardLayoutName(byte[] name);
uint pid = 0;
IntPtr tpid = GetWindowThreadProcessId(fore_ptr, out pid);
IntPtr hKL = IntPtr.Zero;
if (AttachConsole((int)pid) == true) {
// За идею взят код https://github.com/Maximus5/ConEmu/blob/master/src/ConEmuCD/ConsoleMain.cpp
byte[] byte_name = new byte[8];
StringBuilder sb = new StringBuilder();
// GetConsoleKeyboardLayoutName - недокументированная функция
if (GetConsoleKeyboardLayoutName(byte_name) == true) {
for (int i = 0; i <= byte_name.Length - 1; i++) {
byte_name[i] -= 48;
sb.Append(byte_name[i].ToString());
}
hKL = new IntPtr(Convert.ToInt32(sb.ToString(), 16));
//string name = sb.ToString();
//Console.WriteLine("name:" + name);
}
FreeConsole();
// Последняя попытка:
if(IntPtr.Zero.Equals(hKL) == true) {
hKL = GetKeyboardLayout(tpid);
}
}
else {
hKL = GetKeyboardLayout(tpid);
}
На выходе hKL в windows 7/8 выдаёт правильный результат для консоли (например, 00000419 - русская раскладка), но в Windows 10 недокументированная функция GetConsoleKeyboardLayoutName возвращает false и язык не определяет, hKL-"00000000". Информации по GetConsoleKeyboardLayoutName очень мало и она очень скудная. Для консольного приложения GetKeyboardLayout() выдаёт ноль. Хотелось бы всё-таки получить язык раскладки, а не нули. ???