C#でユーザーのキーボードタイプ(QWERTYまたはAZERTY)を取得するために2日以来試みています。CultureInfo (ローカリゼーション) でやろうと思ったのですが、それは間違いなく優れた回避策ではありません。
何か案が?
C#でユーザーのキーボードタイプ(QWERTYまたはAZERTY)を取得するために2日以来試みています。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);
}
}
ソース; キーボード タイプ (Qwerty または Dvorak) の検出
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