创建控件以捕获使用定义的键组合

时间:2018-04-19 09:00:24

标签: c# winforms keyboard-events

我想创建一个小控件,允许我的应用程序的用户定义组合键,并以人类可读的格式显示它们。

例如,我目前有一个文本框,如果用户有焦点然后按一个键,它将在文本框中记录并显示按下的键,我的问题是关键组合或特殊键(CTRL,ALT,BACKSPACE等)

这是我目前的简单代码,我只是用来试验:

    private void tboxKeyCombo_KeyPress(object sender, KeyPressEventArgs e)
    {
        if (tboxKeyCombo.Focused)
        {
            string sKeyboardCombo = String.Empty;

            if (char.IsLetterOrDigit(e.KeyChar))
            {
                sKeyboardCombo += e.KeyChar.ToString();
            }
            else if (char.IsControl(e.KeyChar))
            {
                sKeyboardCombo += "CTRL";
            }

            tboxKeyCombo.Text += sKeyboardCombo + "+";
        }
    }

目前它表现得非常奇怪,如果我按“CTRL + O”,它会在文本框中显示“CTRL +”。即使我按BACKSPACE,它也只是打印CTRL。

我认为我误解了解密键盘输入的一些部分,所以任何帮助都会很棒 - 谢谢。

1 个答案:

答案 0 :(得分:0)

作为一个选项,你可以创建一个基于TextBox的控件并使其成为只读,然后覆盖一些关键函数,如ProcessCmdKey,并使用KeysConverter类将按下的键转换为字符串

示例

using System.Windows.Forms;
public class MyTextBox : TextBox
{
    public MyTextBox() { this.ReadOnly = true; }
    public Keys ShortcutKey { get; set; }
    public new bool ReadOnly
    {
        get { return true; }
        set { base.ReadOnly = true; }
    }
    KeysConverter converter = new KeysConverter();
    protected override bool ProcessCmdKey(ref Message m, Keys keyData)
    {
        ShortcutKey = keyData;
        this.Text = converter.ConvertToString(keyData);
        return false;
    }
}