【问题标题】:How to detect keyboard layout? [duplicate]如何检测键盘布局? [复制]
【发布时间】:2014-05-12 18:28:02
【问题描述】:

有没有办法以编程方式检测用户正在使用的键盘布局?

例如,如果用户使用的是 QWERTY 布局,则应该出现一个消息框,表明用户正在使用 QWERTY 键盘,AZERTY、QWERTZ 等...我不知道从哪里开始以及如何完成。

【问题讨论】:

  • 您是否尝试过使用this answer中的信息?似乎它可以扩展到您的用途。
  • 你为什么试图用一个消息框告诉用户一些事情,他可以通过看他的键盘来轻松地弄清楚自己?
  • 不是为了那个使用消息框只是一个例子。这样做的用途是键映射。

标签: c#


【解决方案1】:

根据该问题Keyboard Type (Qwerty or Dvorak) detection 中建议的答案,这是我带来的:

public partial class Form1 : Form
{
    const int KL_NAMELENGTH = 9;

    [DllImport("user32.dll")]
    private static extern long GetKeyboardLayoutName(
          System.Text.StringBuilder pwszKLID);

private void Form1_Load(object sender, EventArgs e)
    {
        StringBuilder name = new StringBuilder(KL_NAMELENGTH);
        GetKeyboardLayoutName(name);
        String KeyBoardLayout = name.ToString();
        if (KeyBoardLayout == "00000407" || KeyBoardLayout == "00000807")
        {
            MessageBox.Show("Using QWERTZ");
        }
        else if (KeyBoardLayout == "0000040c" || KeyBoardLayout == "0000080c")
        {
            MessageBox.Show("Using AZERTY");
        }
        else if (KeyBoardLayout == "00010409")
        {
            MessageBox.Show("Using Dvorak");
        }
        else
        {
            MessageBox.Show("Using QWERTY");
        }
    }   
}

取自此处的键盘区域设置 ID:Locale IDs, Input Locales, and Language Collections for Windows XP and Windows Server 2003

【讨论】:

    【解决方案2】:

    我认为有一种简单的方法可以以“AZERTY”或“QWERTY”的形式获取布局,但显然没有......但是,您可以通过从扫描码中请求键名来作弊.此代码根据当前布局返回“AZERTY”、“QWERTY”或“QWERTZ”:

    private static string GetKeyboardLayout()
    {
        var layout = new StringBuilder();
        var buffer = new StringBuilder(64);
        for (int i = 0; i < 6; i++)
        {
            int scanCode = 0x10 + i;
            int lParam = scanCode << 16;
            GetKeyNameText(lParam, buffer, buffer.Capacity);
            layout.Append(buffer.ToString());
        }
        return layout.ToString();
    }
    
    [DllImport("user32.dll")]
    private static extern int GetKeyNameText(int lParam, StringBuilder lpString, int cchSize);
    

    当然,它不适用于 Dvorak 键盘,因为布局实际上并不拼写“DVORAK”...(我怀疑返回的值对于非拉丁键盘也毫无意义)

    【讨论】:

      猜你喜欢
      • 2011-02-28
      • 2017-12-04
      • 2020-07-29
      • 2011-04-17
      • 2021-11-14
      • 2019-07-02
      • 2021-12-31
      • 1970-01-01
      • 2010-10-24
      相关资源
      最近更新 更多