我的问题很简单:
我们的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);
}
}