将键盘事件从一种形式发送到另一种形式

tha*_*alm 5 c# forms keyboard mono events

我的问题很简单:

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

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

是否有一种简单的方法可以将所有键盘事件从子窗体传播到“所有者”窗体?还是只是一般的另一种形式?

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

编辑:我有确切的问题是使用另一种形式的相同快捷方式触发菜单项。当然,如果添加了新项目的菜单更改,则无需更新表单中的代码。

kos*_*svs 5

这就是为我解决的问题:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)