c#捕获主要窗体键盘事件

本文关键字:窗体 键盘 事件 | 更新日期: 2023-09-27 18:02:11

如何捕获WinForm主窗体的键盘事件,其他控件在哪里。所以我想抓住一个事件Ctrl + S,不管焦点在哪里。但是如果没有Pinvoke(钩子之类的……)只有。net管理内部电源

c#捕获主要窗体键盘事件

表单类(System.Windows.Forms)有OnKeyDown, OnKeyPress和OnKeyUp事件方法,您可以使用它们来检测Ctrl + S

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

编辑

确保启用Form.KeyPreview = true;,这样表单将捕获事件,而不管焦点是什么

试试下面的代码。使用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;
        }
    }
}

处理表单及其所有控件的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");
        }
    }
}

你可以添加一个菜单栏,然后创建一个名为save的菜单栏项目,并给它一个快捷键Ctrl + s。即使焦点在窗体上的其他控件上,也会触发此操作。如果你不喜欢看到菜单条;你也可以设置visible = false。我必须承认这很难看。