c# – 将键盘事件从一个表单发送到另一个表单

我的问题很简单:

我们的C#应用​​程序有一个MainForm,带有一个菜单和几个与菜单项相关的键盘快捷键.

现在我们也需要从一些子窗体中触发菜单项.但是,由于当其中一个子窗体处于活动状态时,MainForm处于非活动状态,因此快捷方式不起作用.

有没有一种简单的方法可以将所有键盘事件从子表单传播到“所有者”表单?或者只是另一种形式?

啊,我们不能使用一些低级别的东西,因为我们也需要在Mono / Linux上运行应用程序.

编辑:
我遇到的确切问题是从另一个表单触发具有相同快捷方式的菜单项.当然,如果添加新项目的菜单更改,则不更新表单中的代码.

最佳答案 这就是为我解决的问题:

public class MainForm : Form
{
    public bool ProcessCmdKeyFromChildForm(ref Message msg, Keys keyData)
    {
        Message messageCopy = msg;
        messageCopy.HWnd = this.Handle; // We need to assign our own Handle, otherwise the message is rejected!

        return ProcessCmdKey(ref messageCopy, keyData);
    }
}

public class MyChildForm : Form
{
    private MainForm mMainForm;

    public MyChildForm(MainForm mainForm)
    {
        mMainForm = mainForm;
    }

    // This is meant to forward accelerator keys (eg. Ctrl-Z) to the MainForm
    protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
    {
        if (mMainForm.ProcessCmdKeyFromChildForm(ref msg, keyData))
        {
            return true;
        }

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