在WinForms的Left-Upper-Corner Icon菜单中添加一个条目?

Mic*_*tum 5 .net winforms

我有一个WinForms应用程序,我想在用户单击窗口左上角(图标)或按ALT + SPACE时打开的菜单中添加一个菜单项.

表单只显示MainMenu和ContextMenu,但没有图标菜单或类似的东西.有没有一种简单的方法可以在WinForms应用程序上修改它?

我正在谈论这个菜单,我想添加一个简单的"关于"条目,只是为了让人们检查应用程序中的版本和URL.通常的用户界面中没有好的地方(没有主菜单).

Alt + Space菜单http://img513.imageshack.us/img513/3162/altspacemenu.jpg

Ste*_*bob 7

将FormBorderStyle设置为除"None"以外的任何内容时,此菜单将添加到表单中.更改表单边框样式时,将调用名为AdjustSystemMenu的例程.此例程使用GetSystemMenu方法检索SystemMenu?来自某个地方.'某处'就是问题所在.在任何可以访问的地方似乎都没有SystemMenu对象.

编辑:刚刚找到这个链接,看起来它可能会做你想要的.

public partial class Form1 : Form
{
    #region Win32 API Stuff

    // Define the Win32 API methods we are going to use
    [DllImport("user32.dll")]
    private static extern IntPtr GetSystemMenu(IntPtr hWnd, bool bRevert);

    [DllImport("user32.dll")]
    private static extern bool InsertMenu(IntPtr hMenu, Int32 wPosition, Int32 wFlags, Int32 wIDNewItem, string lpNewItem);

    /// Define our Constants we will use
    public const Int32 WM_SYSCOMMAND = 0x112;
    public const Int32 MF_SEPARATOR = 0x800;
    public const Int32 MF_BYPOSITION = 0x400;
    public const Int32 MF_STRING = 0x0;

    #endregion

    // The constants we'll use to identify our custom system menu items
    public const Int32 _SettingsSysMenuID = 1000;
    public const Int32 _AboutSysMenuID = 1001;

    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        /// Get the Handle for the Forms System Menu
        IntPtr systemMenuHandle = GetSystemMenu(this.Handle, false);

        /// Create our new System Menu items just before the Close menu item
        InsertMenu(systemMenuHandle, 5, MF_BYPOSITION | MF_SEPARATOR, 0, string.Empty); // <-- Add a menu seperator
        InsertMenu(systemMenuHandle, 6, MF_BYPOSITION, _SettingsSysMenuID, "Settings...");
        InsertMenu(systemMenuHandle, 7, MF_BYPOSITION, _AboutSysMenuID, "About...");
    }

    protected override void WndProc(ref Message m)
    {
        // Check if a System Command has been executed
        if (m.Msg == WM_SYSCOMMAND)
        {
            // Execute the appropriate code for the System Menu item that was clicked
            switch (m.WParam.ToInt32())
            {
                case _SettingsSysMenuID:
                    MessageBox.Show("\"Settings\" was clicked");
                    break;
                case _AboutSysMenuID:
                    MessageBox.Show("\"About\" was clicked");
                    break;
            }
        }

        base.WndProc(ref m);
    }
}
Run Code Online (Sandbox Code Playgroud)