C# 为什么父窗体响应其子窗体的快捷键?

C# 为什么父窗体响应其子窗体的快捷键?,c#,winforms,C#,Winforms,C#WinForms:我有一个MDI表单,我为它的菜单定义了一些快捷键,例如“ALT+C”以打开操作工具栏按钮。问题是,如果我在父窗体内打开此子窗体,但仍在父窗体内的某个位置单击鼠标并按“ACLT+C”,则它仍会响应此命令并打开子窗体的“操作”菜单。如何防止这种情况发生?在表单上添加一个标志 bool actionWindow = false 然后当窗口打开时,将actionWindow设置为true。在侦听器中检查actionWindow。然后当actionWindow关闭时,将bool设置

C#WinForms:我有一个MDI表单,我为它的菜单定义了一些快捷键,例如“ALT+C”以打开操作工具栏按钮。问题是,如果我在父窗体内打开此子窗体,但仍在父窗体内的某个位置单击鼠标并按“ACLT+C”,则它仍会响应此命令并打开子窗体的“操作”菜单。如何防止这种情况发生?

在表单上添加一个标志

bool actionWindow = false
然后当窗口打开时,将actionWindow设置为true。在侦听器中检查actionWindow。然后当actionWindow关闭时,将bool设置回false


try:在子表单中,put e.Handled=true;在按键事件中。

可能有更好的解决方案,但快速的方法是测试表单是否有焦点。因此,在子事件处理程序的顶部添加以下内容:

if ( this.MdiParent.ActiveControl.Name != this.Name )
{
    return;
}
显然,这并不是阻止事件触发,而是阻止后续代码运行

编辑:如果菜单项没有事件处理程序,我能想到的唯一其他方法是为子窗体的
Enter
Leave
事件创建处理程序:

private void ChildForm_Leave( object sender, EventArgs e )
{
    menuItem.Enabled = false;
}

private void ChildForm_Enter( object sender, EventArgs e )
{
    menuItem.Enabled = true;
}

我没有对MDI表单做过任何操作,但是您描述的行为是正确的,这对我来说是有意义的。您必须使用MDI作为父窗体吗?我们已经从VB 6.0升级了此应用程序,在VB 6.0中,当我单击“ALT+C”时,它不会打开子窗体的“操作”菜单。所以在代码审查时,他会说不,它不同于VB,为什么不使用白框等等。从vb6到.net有很多变化,就像我说的,我对MDI表单不太了解。我要么不使用mdi,要么使用上面的hack…我希望您能找到一个好的解决方案。对不起,我帮不了你。我更改了答案,加入了另一个选项。将e.Handled=true设置为子窗体上的按键/下键事件…确保在子窗体中也打开keypreview。单步执行代码时,按键似乎先转到父窗体,然后再转到子窗体…这样行吗?父事件在子事件之前激发。我应该在我的子窗体的哪个方法、事件处理程序等中尝试您的代码?