C#捕获主窗体键盘事件

8

如何捕获WinForm主窗体的键盘事件,其中包含其他控件。 因此,我想捕获一个事件 Ctrl + S ,无论焦点在哪里。 但是不使用Pinvoke(钩子等...) 只使用.NET托管内部功能。


1
可能是在WinForms中实现键盘快捷键的最佳方法?的重复问题。 - Hans Passant
4个回答

12

你忽略了“无论焦点在哪里都不影响”的要求。 - Hans Passant
你读过这句话吗: “所以我想捕捉到一个 Ctrl + S 事件,无论焦点在哪里。” 请仔细阅读。 - user834850

11

尝试使用以下代码。使用界面 IMessageFilter,您可以过滤任何 ctrl+键。

public partial class Form1 : 
    Form,
    IMessageFilter
{
    public Form1()
    {
        InitializeComponent();

        Application.AddMessageFilter(this);
        this.FormClosed += new FormClosedEventHandler(this.Form1_FormClosed);
    }

    private void Form1_FormClosed(object sender, FormClosedEventArgs e)
    {
        Application.RemoveMessageFilter(this);
    }

    public bool PreFilterMessage(ref Message m)
    {
        //here you can specify  which key you need to filter

        if (m.Msg == 0x0100 && (Keys)m.WParam.ToInt32() == Keys.S &&
            ModifierKeys == Keys.Control) 
        {
            return true;
        }
        else
        {
            return false;
        }
    }
}

我测试过了,对我起作用。


1
处理窗体及其所有控件上的 KeyDown 事件。
private void OnFormLoad(object sender, EventArgs e)
{
    this.KeyDown += OnKeyDown;
    foreach (Control control in this.Controls)
    {
        control.KeyDown += OnKeyDown;
    }
}

private void OnKeyDown(object sender, KeyEventArgs e)
{
    if (e.Control)
    {
        if (e.KeyValue == (int)Keys.S)
        {
            Console.WriteLine("ctrl + s");
        }
    }
}

你有没有读过:“所以我想捕获一个Ctrl + S事件,无论焦点在哪里”。请仔细阅读。 - user834850
@Robb:是的,我看过那个了,但我认为“不管焦点在哪里”这个阶段是指在表单内部或其控件上,因此无论焦点在例如textBox1还是在表单中,都可以。这不是你的意思吗? - Jalal Said
@Robb:你注意到我之前评论中的问题了吗? - Jalal Said
Jalal,是的,我是这个意思...但是如果这个问题只涉及到KeyDown事件,那么我就不会问了。以前我用过P/Invoke键盘钩子程序,在此情况下,Asish的回答正是我所需要的。 - user834850

1
你可以添加一个MenuStrip,然后创建一个名为“保存”的菜单项,并为其设置快捷键Ctrl + S。为此添加事件处理程序。即使焦点在表单上的其他控件上,这也会触发。如果您不想看到MenuStrip,则可以将visible = false设置为true。我必须承认这很丑陋。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接