C# 所有表单都有相同的主菜单-winforms.net

C# 所有表单都有相同的主菜单-winforms.net,c#,.net,forms,winforms,C#,.net,Forms,Winforms,我想在我的应用程序中的所有打开的表单中使用一个MainMenuStrip。我不想在所有窗体上显示相同的主菜单,相反,主菜单应该只出现在我的主窗体上,并且应该可以从所有其他窗体访问 所需的行为与Visual Studio 2013中的相同(可能其他版本也采用相同的方式)。如果一个文档处于浮动状态,并且您按下ALT按钮或任何组合(例如ALT+F),则主窗口将出现在前面,并且主菜单可见,尽管主窗口似乎没有激活。再次按下ALT按钮时,焦点将返回浮动窗口 当按下菜单键时,我尝试将消息从同级表单转发到主表单

我想在我的应用程序中的所有打开的表单中使用一个MainMenuStrip。我不想在所有窗体上显示相同的主菜单,相反,主菜单应该只出现在我的主窗体上,并且应该可以从所有其他窗体访问

所需的行为与Visual Studio 2013中的相同(可能其他版本也采用相同的方式)。如果一个文档处于浮动状态,并且您按下ALT按钮或任何组合(例如ALT+F),则主窗口将出现在前面,并且主菜单可见,尽管主窗口似乎没有激活。再次按下ALT按钮时,焦点将返回浮动窗口

当按下菜单键时,我尝试将消息从同级表单转发到主表单,但主表单必须是前台窗口才能处理消息-正如我在.net源代码中看到的那样

我不想使用MDI-我只希望拥有与MDI中相同的菜单行为


如果有人对如何实现这一点有任何建议,我将非常感激。

如果你想模仿VS的行为,那么这里有一个方法

static class Program
{
    static Form _main;
    static Form _previous;

    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        // simulate some environment here
        _main = new Form1();
        _main.FormClosed += (s, e) => Application.Exit();
        _main.Show();
        new Form2 { Text = "1" }.Show();
        new Form2 { Text = "2" }.Show();
        new Form2 { Text = "3" }.Show();
        Application.Run();
    }

    public static void MenuOpen(Form form)
    {
        _main.Activate();
        _previous = form;
        _main.MainMenuStrip.MenuDeactivate += MainMenuStrip_MenuDeactivate;
        _main.MainMenuStrip.Show();
    }

    static void MainMenuStrip_MenuDeactivate(object sender, EventArgs e)
    {
        _main.MainMenuStrip.MenuDeactivate -= MainMenuStrip_MenuDeactivate;
        _previous.Activate();
        _previous.Focus();
    }
}
Form1
是任何定义了
MainMenuStrip
的表单(也称为主表单),当表单关闭时,应用程序结束

Form2
中,您只需处理菜单按键,一种可能性是预览按键向下事件处理程序(不要忘记设置
KeyPreview=true
):

演示:


点击菜单热键时,记住表单,激活主表单,显示菜单。菜单关闭时-激活上一个表单。还是我遗漏了什么?这个问题与命令行界面有什么关系?该标记似乎不相关。该标记应该是cli,就像在c++/cli中一样。您有一个很好的答案,但我仍然很好奇,为什么您不想使用mdi,而只想在mdi中模拟它?您的子窗体被卡在主窗体的范围内。我需要能把它们拖出来,效果很好。我必须将ProcessCmdKey与VK_菜单一起使用,因为其他控件会捕获PreviewKeyDown事件。谢谢!
void Form2_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e) 
{
    if (e.Alt)
        Program.MenuOpen(this);
}