【问题标题】:C# - Get user keyboard type (QWERTY/AZERTY)C# - 获取用户键盘类型 (QWERTY/AZERTY)
【发布时间】:2013-10-26 10:58:31
【问题描述】:

我从 2 天以来一直在尝试在 C# 中获取用户的键盘类型(QWERTY 或 AZERTY)。 我曾考虑使用 CultureInfo(本地化)来做这件事,但这绝对不是一个很好的解决方法。

有什么想法吗?

【问题讨论】:

  • 你为什么要这样做?
  • @DavidArno 也许是为 PC 游戏设置不同的默认控件?可能想为不同的布局使用不同的键?
  • 确实是为 PC 游戏设计的 :)

标签: c# keyboard keyboard-layout qwerty


【解决方案1】:

您可以使用 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);

     }
   }

来源; Keyboard Type (Qwerty or Dvorak) detection

MSDN; http://msdn.microsoft.com/en-us/library/windows/desktop/ms646298(v=vs.85).aspx

【讨论】:

    【解决方案2】:

    我知道这是一个老问题,但选择的答案并没有准确地告诉我它是 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

    【讨论】:

      猜你喜欢
      • 2018-03-28
      • 2020-07-29
      • 2015-02-08
      • 2018-01-19
      • 2020-07-14
      • 1970-01-01
      • 2016-01-19
      • 2013-01-23
      • 2019-03-30
      相关资源
      最近更新 更多