C#捕获主窗体键盘事件

时间:2011-07-14 17:15:07

标签: c# winforms

如何捕获WinForm主窗体的键盘事件,其他控件在哪里。 所以我想要捕捉一个事件 Ctrl + S 并且焦点在哪里无关紧要。 但没有Pinvoke(挂钩等......) 只有.NET管理内部电源。

4 个答案:

答案 0 :(得分:10)

Form Class (System.Windows.Forms)OnKeyDownOnKeyPressOnKeyUp事件方法可用于检测 Ctrl + S < / KBD>

在这些方法中使用KeyEventArgs来确定按下了哪些键

修改

请务必启用Form.KeyPreview = true;,以便无论焦点如何,表单都会捕获事件。

答案 1 :(得分:10)

试试这段代码。使用界面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;
        }
    }
}

我测试了这个并为我工作。

答案 2 :(得分: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");
        }
    }
}

答案 3 :(得分:0)

您可以添加一个MenuStrip,然后创建一个名为save的菜单条项目,并给它一个快捷键Ctrl + S.为此添加一个事件处理程序。即使焦点在表单上的其他控件上,这也会触发。如果你不喜欢看MenuStrip;你也可以设置visible = false。我必须承认这很难看。