如何在c#中使用c-cedilla键ProcessCmdKey快捷键

问题描述 投票:0回答:1

我想创建一个快捷方式,当在我的应用程序中按下字母“Ç”时,该快捷方式将执行任务。但没有定义“Ç”键。我怎样才能做到这一点? 示例:

protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
    switch (keyData)
    {
         case Keys.Alt | Keys.D1:
             // Number 1
             return true;
         case Keys.Alt | Keys.D2:
             // Number 2
             return true;
         case Keys.Ç:
             // There is no defined "Ç" (c-cedilla) key.
             return true;
        default:
            return base.ProcessCmdKey(ref msg, keyData);
    }
    return true;
}
c# keyboard-shortcuts
1个回答
0
投票

据我从Hans Passant的评论中了解到,按键分配根据键盘组合而变化。所以我想出了这个解决方案。首先指定键盘,然后将快捷键分配给适当的 OEM 键。我知道,这是非常诡辩的,软件逻辑不喜欢诡辩的事情。但总比没有解决方案好。我认为最好的方法是为标准字母指定快捷方式,例如

C

protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
    switch (keyData)
    {
        case Keys.Alt | Keys.D1:
        // Number 2
        case Keys.Alt | Keys.D2:
            // Number 1
            return true;
        // For Turkish Q
        default:
        {
            // For Turkish Q
            if (KeyboardLayout.GetLayoutCode() == "0000041F" && keyData is Keys.Oem5)
            {
                // C-cedilla key.
                return true;
            }
            // For Spanish
            if (KeyboardLayout.GetLayoutCode() == "0000040A" && keyData is Keys.Oem2)
            {
                // C-cedilla key.
                return true;
            }
            return base.ProcessCmdKey(ref msg, keyData);
        }
    }
}

public class KeyboardLayout
{
    private const int KL_NAMELENGTH = 9;
    [DllImport("user32.dll")]
    private static extern long GetKeyboardLayoutName(StringBuilder pwszKLID);
    //each keyboard layout is defined in Windows as a hex code
    public static string GetLayoutCode()
    {
        var name = new StringBuilder(KL_NAMELENGTH);
        GetKeyboardLayoutName(name);

        return name.ToString();
    }
}

请参阅有关键盘检测的主题。

© www.soinside.com 2019 - 2024. All rights reserved.