I would like to call the ContextMenu
when you click on application\'s icon or right mouse click on the title bar of application.
This is the Conte
The menu that you want to show is system ContextMenu
. To work with that you need to import some user32
functions as shown in the code below. I have launched the system menu on button click. You can launch it on any action, right mouse click etc
GetSystemMenu
gets the system menu and TrackPopupMenuEx
is used to display it. PostMessage
is the send system command on menuitem click.
public partial class Window3 : Window
{
private const int WM_SYSCOMMAND = 0x112;
uint TPM_LEFTALIGN = 0x0000;
uint TPM_RETURNCMD = 0x0100;
const UInt32 MF_ENABLED = 0x00000000;
const UInt32 MF_GRAYED = 0x00000001;
internal const UInt32 SC_MAXIMIZE = 0xF030;
internal const UInt32 SC_RESTORE = 0xF120;
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern IntPtr GetSystemMenu(IntPtr hWnd, bool bRevert);
[DllImport("user32.dll")]
static extern int TrackPopupMenuEx(IntPtr hmenu, uint fuFlags,
int x, int y, IntPtr hwnd, IntPtr lptpm);
[DllImport("user32.dll")]
public static extern IntPtr PostMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);
[DllImport("user32.dll")]
static extern bool EnableMenuItem(IntPtr hMenu, uint uIDEnableItem,
uint uEnable);
private void Button_Click(object sender, RoutedEventArgs e)
{
WindowInteropHelper helper = new WindowInteropHelper(this);
IntPtr callingWindow = helper.Handle;
IntPtr wMenu = GetSystemMenu(callingWindow, false);
// Display the menu
if (this.WindowState == System.Windows.WindowState.Maximized)
{
EnableMenuItem(wMenu, SC_MAXIMIZE, MF_GRAYED);
}
else
{
EnableMenuItem(wMenu, SC_MAXIMIZE, MF_ENABLED);
}
int command = TrackPopupMenuEx(wMenu, TPM_LEFTALIGN | TPM_RETURNCMD, 100, 100, callingWindow, IntPtr.Zero);
if (command == 0)
return;
PostMessage(callingWindow, WM_SYSCOMMAND, new IntPtr(command), IntPtr.Zero);
}