winforms 捕获Ctrl+A快捷键

ivqmmu1c  于 2022-11-25  发布在  其他
关注(0)|答案(3)|浏览(153)

我需要捕获键盘上的kepress组合键,这样我就可以覆盖标准函数,我已经尝试了以下方法:

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

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

gwbalxhn

gwbalxhn1#

首先,确保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");
    }
}

因此,您可以在Form1KeyPreview = true)上 * 预览 * KeyDown,执行所需的操作,并 * 阻止 * DataGridView执行 * 全选 *(e.Handled = true

hsgswve4

hsgswve42#

一般而言,若要行程快捷键,您可以覆写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组合,则可以覆盖DataGridViewProcessDataGridViewKey方法:

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);
    }
}
nwo49xxi

nwo49xxi3#

只是为了记录:这也可以通过KeyPress来实现,因为Ctrl+字母键是“特殊的”:

private void Form1_KeyPress(object sender, KeyPressEventArgs e)
    {
        if(e.KeyChar=='\u0001') //Ctrl+A, B=2, C=3 ...
        {
            MessageBox.Show("Control + A");
        }
    }

相关问题