C# - 获取用户键盘类型 (QWERTY/AZERTY)

本文关键字:QWERTY AZERTY 类型 获取 用户 键盘 | 更新日期: 2023-09-27 18:35:46

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

知道吗?

C# - 获取用户键盘类型 (QWERTY/AZERTY)

您可以使用一个

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或德沃夏克)检测

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#,但此页面列出了键盘标识符:窗口语言包默认值