如何在控件具有焦点时防止托管表单处理命令键

时间:2012-03-27 09:47:39

标签: c# winforms keyboard-shortcuts

我正在寻找一种方法来在控制焦点时取消键盘快捷键或命令键(如F1或CTRL + O)的击键。如果可能,在控制级别。

想象一下,我在表单上托管了一个控件(例如一个简单的文本框)。我为Open(CTRL + O)或Help(F1)等命令设置了键盘快捷键。如果控件具有键盘焦点,我按下其中一个命令,以防止执行快捷命令。

我更喜欢一种解决方案,我可以处理这些击键并防止它们在控件级而不是在表单级别“冒泡”。

4 个答案:

答案 0 :(得分:2)

您可以使用KeyDown事件:

    void DropDownBox_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
    {
        switch (e.KeyCode)
        {
            case Keys.Down:
            case Keys.Up:
                ShowPopup();
                e.SuppressKeyDown = true; // Don't pass it to the underlying control
                break;
        }
    }

如果这还不够 - 例如重写Tab或任何其他基本击键,这是一个 very good article about keyhandling

答案 1 :(得分:2)

我发现的唯一解决方案是在控件级别实现/覆盖ProcessCmdKey函数:

protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
    if (keyData >= Keys.F1 && keyData <= Keys.F24)
    {
        WndProc(ref msg);
        return true;
    }
    return base.ProcessCmdKey(ref msg, keyData);
}

我还需要从mainform中删除所有键盘快捷键,并以相同的方式处理它们。

答案 2 :(得分:1)

在keydown事件中使用e.SuppressKeyPress = true;:我已将复选框的访问密钥设为ALT + C并且运行良好。

 private void cboViewType_KeyDown(object sender, KeyEventArgs e)
        {
            if ((Control.ModifierKeys & Keys.Control) == Keys.Control || e.KeyCode == Keys.F1 || ((Control.ModifierKeys & Keys.Alt) == Keys.Alt && e.KeyCode == Keys.C))
            {
                // do whatever you want to do here...
                MessageBox.Show("key overridden");
                e.SuppressKeyPress = true;
            }
            //e.Handled = true;   // will not work for overriding the shortcut etc.
        }

参考:Override ShortCut Keys on .NET RichTextBox

答案 3 :(得分:0)

您可以通过在任何可聚焦控件的KeyEventArgs.Handled = true事件处理程序中设置KeyDown来停止大多数键盘事件的“冒泡”。 它拦截ALT-F4或F1,但不会拦截系统组合,如ALT-TAB。

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void textBox1_KeyDown(object sender, KeyEventArgs e)
    {
        e.Handled = true;
    }
}