Windows窗体.NET中的热键(非全局)

Windows窗体.NET中的热键(非全局),.net,winforms,hotkeys,.net,Winforms,Hotkeys,在我的Windows窗体应用程序中,我希望每次按下一个特殊的按钮来运行测试。有几十个控件,因此在每个控件中实现它需要花费太多时间 是否有一种方法可以设置热键,以便无论我在应用程序中执行什么操作,我都可以按下该键,它将触发我的事件?如果您只有一个表单。您可以将表单设置为.KeyPreview=true,然后向表单的键事件添加代码。您可以重写表单的ProcessCmdKey()方法,该方法在表单上的任何控件看到键笔划之前运行。如果您确实需要在应用程序级别(所有表单)实现此功能,那么您应该让主表单实现

在我的Windows窗体应用程序中,我希望每次按下一个特殊的按钮来运行测试。有几十个控件,因此在每个控件中实现它需要花费太多时间


是否有一种方法可以设置热键,以便无论我在应用程序中执行什么操作,我都可以按下该键,它将触发我的事件?

如果您只有一个表单。您可以将表单设置为.KeyPreview=true,然后向表单的键事件添加代码。

您可以重写表单的ProcessCmdKey()方法,该方法在表单上的任何控件看到键笔划之前运行。如果您确实需要在应用程序级别(所有表单)实现此功能,那么您应该让主表单实现IMessageFilter接口。例如:

public partial class Form1 : Form, IMessageFilter {
    public Form1() {
        InitializeComponent();
        Application.AddMessageFilter(this);
        this.FormClosed += (o, e) => Application.RemoveMessageFilter(this);
    }
    public bool PreFilterMessage(ref Message m) {
        // Catch WM_KEYDOWN message
        if (m.Msg == 0x100 && (Keys)m.WParam == Keys.F1) {
            MessageBox.Show("Help me!");
            return true;
        }
        return false;
    }
}
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
    // if it is a hotkey, return true; otherwise, return false
    switch (keyData)
    {
        case Keys.Control | Keys.C:
            // do something
            return true;
        default:
            break;
    }

    return base.ProcessCmdKey(ref msg, keyData);
}

您可以重写
ProcessCmdKey
,并在控件或表单中处理热键

发件人:

首先是ProcessCmdKey方法 确定控件是否具有 ContextMenu,如果是,则启用 处理命令的上下文菜单 钥匙如果命令键不是菜单 快捷方式,并且控件具有父级, 密钥将传递给父级的 ProcessCmdKey方法。净效应 命令键“冒泡”了 控制层次结构。除了 用户按下的键,键数据 还指示修改器(如果有) 同时按下了按键 钥匙。修改器关键点包括 SHIFT、CTRL和ALT键

例如:

public partial class Form1 : Form, IMessageFilter {
    public Form1() {
        InitializeComponent();
        Application.AddMessageFilter(this);
        this.FormClosed += (o, e) => Application.RemoveMessageFilter(this);
    }
    public bool PreFilterMessage(ref Message m) {
        // Catch WM_KEYDOWN message
        if (m.Msg == 0x100 && (Keys)m.WParam == Keys.F1) {
            MessageBox.Show("Help me!");
            return true;
        }
        return false;
    }
}
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
    // if it is a hotkey, return true; otherwise, return false
    switch (keyData)
    {
        case Keys.Control | Keys.C:
            // do something
            return true;
        default:
            break;
    }

    return base.ProcessCmdKey(ref msg, keyData);
}

我将这个标记为accept,但随后我看到zach编写
return base.ProcessCmdKey(ref msg,keyData)
我觉得自己像个白痴(我过去经常这么做,但这次我没有这么做),于是更新了我的代码。他因为他的回答让我想起我的错误而受到责备。虽然你有更多的答案。这是一个艰难的选择。