我从 2 天以来一直在尝试在 C# 中获取用户的键盘类型(QWERTY 或 AZERTY)。我考虑过使用 CultureInfo(本地化)来做这件事,但这绝对不是一个很好的解决方法。
任何想法?
我从 2 天以来一直在尝试在 C# 中获取用户的键盘类型(QWERTY 或 AZERTY)。我考虑过使用 CultureInfo(本地化)来做这件事,但这绝对不是一个很好的解决方法。
任何想法?
您可以使用 GetKeyboardLayout 方法;
public class Program
{
const int KL_NAMELENGTH = 9;
[DllImport("user32.dll")]
private static extern long GetKeyboardLayoutName(
System.Text.StringBuilder pwszKLID);
static void Main(string[] args)
{
StringBuilder name = new StringBuilder(KL_NAMELENGTH);
GetKeyboardLayoutName(name);
Console.WriteLine(name);
}
}
MSDN;http://msdn.microsoft.com/en-us/library/windows/desktop/ms646298(v=vs.85).aspx
我知道这是一个老问题,但选择的答案并没有准确地告诉我它是 QWERTY 还是 AZERTY。相反,它会为您提供键盘标识符*
然而,在摆弄了虚拟键和 DirectInput 扫描码之后,这就是我想出的:
public static class KeyboardLayoutUtils
{
[DllImport("user32.dll")]
public static extern uint MapVirtualKey(uint uCode, uint uMapType);
private static uint MAPVK_VSC_TO_VK = 0x01;
// scan codes for US QWERTY based on DirectInput
private static readonly uint[] _QwertyScanCodes =
{
0x00000010,
0x00000011,
0x00000012,
0x00000013,
0x00000014,
0x00000015,
};
public static string GetCurrentKeyboardLayoutAsString()
{
// TODO: please add checks and validations, etc
string layout = string.Empty;
foreach (var code in _QwertyScanCodes)
{
var vk = MapVirtualKey(code, MAPVK_VSC_TO_VK);
var val = KeyInterop.KeyFromVirtualKey((int) vk);
layout += val;
}
return layout;
}
}
所以简单地调用上面的代码:
Console.WriteLine(KeyboardLayoutUtils.GetCurrentKeyboardLayoutAsString());
// outputs: QWERTY OR AZERTY depending on the active input language
会给你“QWERTY”或“AZERTY”,或者实际上是 qwerty 位置上的 6 个字符。
*作为附加参考,虽然不完全适用于 C#,但此页面列出了键盘标识符:windows-language-pack-default-values