【问题标题】:Capturing Ctrl+A shortcut key捕获 Ctrl+A 快捷键
【发布时间】:2018-02-15 10:08:49
【问题描述】:

我需要在键盘上捕获一个按键组合,以便我可以覆盖标准功能,我尝试了以下方法:

private void Form1_KeyDown(object sender, KeyEventArgs e)
{
    if (e.Control && e.KeyCode == Keys.A)
    {
        MessageBox.Show("Hello");
    }
}

但是当按下Ctrl+A 时,消息不会被触发。最终目标是覆盖Form1 内DataGridView 中的Windows 快捷方式“全选”,以确保在表单窗口中按下Ctrl+A 时仅选择某些行。

【问题讨论】:

  • 试试e.Modifiers == Keys.Control && e.KeyCode == Keys.A
  • 分配Form1的KeyPreview = true属性
  • 谢谢你,虽然有一个注意事项...起初它不起作用,因为我将它设置在 Form KeyDown 事件而不是 DataGridView KeyDown 事件下。似乎当表单中存在 DataGridView 时,它会自动挂钩 Ctrl+A 快捷方式。请发布您的答案,以便我可以选择它作为解决方案;)
  • @dmitry-bychenko 谢谢,我想这解决了我刚才描述的问题?

标签: c# winforms


【解决方案1】:

首先,确保Form1属性

KeyPreview = true

接下来,不要忘记处理消息(你不希望DataGridView处理消息并执行SelectAll)

private void Form1_KeyDown(object sender, KeyEventArgs e)
{
    if (e.Control && e.KeyCode == Keys.A)
    {
        e.Handled = true; // <- do not pass the event to DataGridView

        MessageBox.Show("Hello");
    }
}

所以您预览 KeyDown 在Form1 (KeyPreview = true) 上,执行所需的操作,并防止 DataGridView 执行select全部 (e.Handled = true)

【讨论】:

    【解决方案2】:

    一般要处理快捷键,可以覆盖ProcessCmdKey。通过重写此方法,您可以处理组合键:

    protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
    {
        if (keyData == (Keys.Control | Keys.A))
        {
            MessageBox.Show("Control + A");
            return true;
        }
        return base.ProcessCmdKey(ref msg, keyData);
    }
    

    返回true,表示它由您的代码处理,密钥不会传递给子控件。所以在表单级别覆盖这个方法就足够了。

    但是如果你是专门讲DataGridView来自定义Ctrl + A组合,你可以覆盖DataGridView的ProcessDataGridViewKey方法:

    public class MyDataGridView : DataGridView
    {
        protected override bool ProcessDataGridViewKey(KeyEventArgs e)
        {
            if (e.KeyData == (Keys.A | Keys.Control))
            {
                MessageBox.Show("Handled");
                return true; 
            }
            return base.ProcessDataGridViewKey(e);
        }
    }
    

    【讨论】:

    • 覆盖ProcessCmdKey你不需要设置密钥预览。
    猜你喜欢
    • 2013-11-04
    • 2020-11-16
    • 1970-01-01
    • 1970-01-01
    • 2021-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多