Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何检测键盘布局?_C# - Fatal编程技术网

C# 如何检测键盘布局?

C# 如何检测键盘布局?,c#,C#,有没有办法通过编程检测用户使用的键盘布局 例如,如果用户正在使用QWERTY布局,则应显示一个消息框,表明用户正在使用QWERTY键盘,与AZERTY、QWERTZ等相同。。。我不知道从何处开始以及如何完成这一点。根据该问题的答案,我得出以下结论: public partial class Form1 : Form { const int KL_NAMELENGTH = 9; [DllImport("user32.dll")] private static extern

有没有办法通过编程检测用户使用的键盘布局


例如,如果用户正在使用QWERTY布局,则应显示一个消息框,表明用户正在使用QWERTY键盘,与AZERTY、QWERTZ等相同。。。我不知道从何处开始以及如何完成这一点。

根据该问题的答案,我得出以下结论:

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取自此处:

我认为有一种简单的方法可以获得“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);
private静态字符串GetKeyboardLayout()
{
var layout=新的StringBuilder();
var buffer=新的StringBuilder(64);
对于(int i=0;i<6;i++)
{
int扫描码=0x10+i;

int lParam=scanCode您是否尝试过使用中的信息?似乎它可以扩展到您的用途。或者,这是:为什么您试图用一个消息框告诉用户一些信息,用户只需看一下键盘就可以轻松了解自己的情况?不是为了这个用途,消息框只是一个示例。这是用于键映射的。