Click here to Skip to main content
Click here to Skip to main content

Customize Window System Menu in WPF

By , 4 Feb 2012
 
Most of the times, I wondered how System Menu in Native Window has been replaced with custom Menu in WPF. Finally, I found the trick. I just want to share the idea here.
 
Normally, WPF does not allow direct customization to Non-client area of Window. But that can be done using native methods. We need to hook the WndProc method. WPF has no override method as Winforms does. The following code shows how to hook WndProc();

private void OnLoaded(object sender, RoutedEventArgs e)
        {
            IntPtr windowhandle = new WindowInteropHelper(this).Handle;
            HwndSource hwndSource = HwndSource.FromHwnd(windowhandle);
            hwndSource.AddHook(new HwndSourceHook(WndProc));
        }
 
private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam,    ref bool handled)
        {
            //Code goes here...

            return IntPtr.Zero;
        }
 
First, we should hide the default System Menu in Window.
 
To hide the default System Menu in Window, we should handle the particular message. Corresponding window message and parameter for opening System Menu is 0xa4 and 0x02 respectively.
 
        private const uint WM_SYSTEMMENU = 0xa4;
        private const uint WP_SYSTEMMENU = 0x02;
 
        private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
        {
 
            //Message for System Menu...

            if ((msg == WM_SYSTEMMENU) && (wParam.ToInt32() == WP_SYSTEMMENU))
            {
                ShowContextMenu();
                handled = true;
            }
 
            return IntPtr.Zero;
        }
 
ShowContextMenu() method will show our custom Context Menu declared in Window resources.
 
    <Window.Resources>
        <ContextMenu x:Key="systemMenu">
            <MenuItem Header="Help" InputGestureText="F1">
                <MenuItem.Icon>
                    <Image Source="Help.png" Height="16"/>
                </MenuItem.Icon>
            </MenuItem>
            <MenuItem Header="Choose theme">
                <MenuItem.Icon>
                    <Image Source="ChooseColor.png" Height="16"/>
                </MenuItem.Icon>
            </MenuItem>
            <MenuItem Header="Add Note">
                <MenuItem.Icon>
                    <Image Source="NoteHS.png" Height="16"/>
                </MenuItem.Icon>
            </MenuItem>
            <Separator />
            <MenuItem Header="Exit"/>
        </ContextMenu>
    </Window.Resources>
 
Get the Context Menu in code behind through a property,
 
public ContextMenu SystemMenu
        {
            get
            {
                return Resources["systemMenu"] as ContextMenu;
            }
        }
 
Show the ContextMenu in code behind:
 
private void ShowContextMenu()
        {
            if (SystemMenu != null)
            {
                SystemMenu.IsOpen = true;
            }
        }

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

About the Author

Jawahar Suresh Babu
Software Developer
India India
Member
Jawahar working as Software Developer in Chennai, developing WPF and Silverlight UI components. He usually strong in Expression Blend, WPF/Silverlight control developement, Data Binding.
 
Developed few products for Syncfusion Inc.
 
http://wpfplayground.blogspot.com/

Sign Up to vote   Poor Excellent
Add a reason or comment to your vote: x
Votes of 3 or less require a comment

Comments and Discussions

 
Hint: For improved responsiveness ensure Javascript is enabled and choose 'Normal' from the Layout dropdown and hit 'Update'.
You must Sign In to use this message board.
Search this forum  
    Spacing  Noise  Layout  Per page   
GeneralMy vote of 2memberMember 39979865 Jan '13 - 15:59 
Very good example of lazy article. No screenshots.

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Permalink | Advertise | Privacy | Mobile
Web01 | 2.6.130516.1 | Last Updated 4 Feb 2012
Article Copyright 2012 by Jawahar Suresh Babu
Everything else Copyright © CodeProject, 1999-2013
Terms of Use
Layout: fixed | fluid