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

时间:2010-05-07 18:45:03

标签: .net winforms hotkeys

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

有没有办法可以设置热键,无论我在应用程序中做什么,我都可以按键,它会触发我的事件?

3 个答案:

答案 0 :(得分:15)

您可以覆盖ProcessCmdKey并在控件或表单中处理热键。

来自MSDN

  

首先是ProcessCmdKey方法   确定控件是否具有   ContextMenu,如果是的话,启用   ContextMenu用于处理命令   键。如果命令键不是菜单   快捷方式和控件有父,   密钥传递给父母的   ProcessCmdKey方法。净效应   是命令键被“冒泡”了   控制层次结构。此外   用户按下的键,关键数据   还指示哪个修饰符(如果有的话)   按键同时按下   钥匙。修饰键包括   SHIFT,CTRL和ALT键。

例如:

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

答案 1 :(得分:4)

您可以覆盖表单的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;
    }
}

答案 2 :(得分:1)

如果您只有一张表格。您可以设置Form.KeyPreview = true,然后将代码添加到表单的键事件中。