12

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

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

4

3 回答 3

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);
}
于 2010-05-07T18:58:25.587 回答
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;
    }
}
于 2010-05-07T18:53:16.900 回答
1

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

于 2010-05-07T18:47:55.103 回答