如何防止 MenuStrip 处理 WinForms 中的某些键?

How to prevent MenuStrip from handling certain keys in WinForms?

我有一个带有 MenuStrip 的表单,我想在其中对“CTRL + P”击键做出反应。

问题是,如果打开 MenuStrip,我的表单不会得到“CTRL + P”。

我尝试设置 Form 的 KeyPreview = true,并重写 ProcessCmdKey 但没有成功...

有我的 ProcessCmdKey 覆盖:

protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
    if (keyData == (Keys.Control | Keys.P))
    {
        MessageBox.Show("ProcessCmdKey Control + P");
            return true;
    }
        return base.ProcessCmdKey(ref msg, keyData);
}

消息不经过表单的关键事件,它将由每个下拉菜单处理。

您可以使用评论中提到的方法,或者作为另一种选择,您可以在派发到下拉列表之前实施 IMessageFilter to capture the WM_KEYDOWN

public partial class Form1 : Form, IMessageFilter
{
    const int WM_KEYDOWN = 0x100;
    public bool PreFilterMessage(ref Message m)
    {
        if (ActiveForm != this)
            return false;

        if (m.Msg == WM_KEYDOWN && 
            (Keys)m.WParam == Keys.P && ModifierKeys == Keys.Control)
        {
            MessageBox.Show("Ctrl + P pressed");
            return true;
        }
        return false;
    }
    protected override void OnLoad(EventArgs e)
    {
        base.OnLoad(e);
        Application.AddMessageFilter(this);
    }
    protected override void OnClosing(CancelEventArgs e)
    {
        base.OnClosing(e);
        Application.RemoveMessageFilter(this);
    }
}