[Sample of Apr 6th] Customize Windows Forms app's System Menu

 

Homepage image
Sample of the Day RSS Feed

Sample Download: https://code.msdn.microsoft.com/CSCustomizeSysMenu-024ccb7f

Today’s code sample demonstrates how to modify a Windows Forms application’s system menu

image

The sample was written by the Microsoft engineer Nibu Babu Thomas.

imageYou can find more code samples that demonstrate the most typical programming scenarios by using Microsoft All-In-One Code Framework Sample Browser or Sample Browser Visual Studio extension. They give you the flexibility to search samples, download samples on demand, manage the downloaded samples in a centralized place, and automatically be notified about sample updates. If it is the first time that you hear about Microsoft All-In-One Code Framework, please watch the introduction video on Microsoft Showcase, or read the introduction on our homepage https://1code.codeplex.com/.

 

Introduction

This application demonstrates how to modify a Windows Forms application’s system menu.

 

Running the Sample

This is how the application looks like…

image

 

Using the Code

In this application I’ve demonstrated how to do the following actions…

1.
Retrieve system menu: refer btnAddToFormSystemMenu_Click 2.
Modify system menu: refer btnAddToFormSystemMenu_Click 3.
Retrieve text item of a system menu item: refer handleSysCustomCommand

How to handle events from system menu items: refer WndProc

The gist of the application lies in the following functions…

 private void btnAddToFormSystemMenu_Click(object sender, EventArgs e) 
{ 
    IntPtr hMenu = GetSystemMenu(this.Handle, false); 
    if (hMenu != IntPtr.Zero) 
    { 
        Int32 Count             = GetMenuItemCount(hMenu); 
        MENUITEMINFO mnuInfo    = new MENUITEMINFO(); 
        mnuInfo.cbSize          = MENUITEMINFO.sizeOf; 
        mnuInfo.fMask           = MIIM_STRING | MIIM_ID; 
        mnuInfo.fState          = MFS_ENABLED; 
        mnuInfo.fType           = MFT_STRING; 
        mnuInfo.wID             = BaseCommandId + ++CurrentIndex; 
        mnuInfo.dwTypeData      = txtMenuCaption.Text; 
        InsertMenuItem(hMenu, (UInt32)Count, true, ref mnuInfo); 
        DrawMenuBar(hMenu); 
    } 
} 
 private void handleSysCustomCommand(UInt32 CmdId) 
{ 
    IntPtr hMenu = GetSystemMenu(this.Handle, false); 
    MENUITEMINFO mnuInfo = new MENUITEMINFO(); 
    mnuInfo.cbSize = MENUITEMINFO.sizeOf; 
    mnuInfo.fType = MFT_STRING; 
    mnuInfo.fMask = MIIM_STRING; 
  
    // Get size of buffer first, this call will fill out mnuInfo.cch val which is the buffere size 
    if (!GetMenuItemInfo(hMenu, CmdId, false, ref mnuInfo)) 
    { 
        ShowLastError(); 
    } 
    else 
    { 
        // Pad up a bit 
        mnuInfo.cch += 4;  
        mnuInfo.dwTypeData = new String(' ', (Int32)mnuInfo.cch); 
        if(!GetMenuItemInfo(hMenu, CmdId, false, ref mnuInfo)) // This time get menu item text 
        { 
            ShowLastError(); 
        } 
        else 
        { 
            String Text = String.Format("You clicked on: {0}", mnuInfo.dwTypeData); 
            MessageBox.Show(Text, "Menu text", MessageBoxButtons.OK, MessageBoxIcon.Information); 
        } 
    } 
} 
  
// A demo on how to handle the event from the new system menu items... 
protected override void WndProc(ref Message Msg) 
{ 
    if (Msg.Msg == WM_SYSCOMMAND) 
    { 
        if ((UInt32)Msg.WParam.ToInt32() > BaseCommandId) 
        { 
            handleSysCustomCommand((UInt32)Msg.WParam.ToInt32()); 
        } 
    } 
    base.WndProc(ref Msg); 
} 
  

More Information

GetSystemMenu function
https://msdn.microsoft.com/en-us/library/windows/desktop/ms647985(v=vs.85).aspx

GetMenuItemInfo function
https://msdn.microsoft.com/en-us/library/windows/desktop/ms647980(v=vs.85).aspx

GetMenuItemCount
https://msdn.microsoft.com/en-us/library/windows/desktop/ms647978(v=vs.85).aspx

DrawMenuBar function
https://msdn.microsoft.com/en-us/library/windows/desktop/ms647633(v=vs.85).aspx

GetMenuItemID function
https://msdn.microsoft.com/en-us/library/windows/desktop/ms647979(v=vs.85).aspx

GetMenuInfo function
https://msdn.microsoft.com/en-us/library/windows/desktop/ms647977(v=vs.85).aspx