| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162 | using System;using System.Collections.Generic;using System.Linq;using System.Runtime.InteropServices;using System.Text;using System.Threading.Tasks;using System.Windows;using System.Windows.Interop;namespace WpfStyleableWindow.StyleableWindow{    public static class SystemMenuManager    {                public static void ShowMenu(Window targetWindow, Point menuLocation)        {            if (targetWindow == null)                throw new ArgumentNullException("TargetWindow is null.");            int x, y;            try            {                x = Convert.ToInt32(menuLocation.X);                y = Convert.ToInt32(menuLocation.Y);            }            catch (OverflowException)            {                x = 0;                y = 0;            }            uint WM_SYSCOMMAND = 0x112, TPM_LEFTALIGN = 0x0000, TPM_RETURNCMD = 0x0100;                       IntPtr window = new WindowInteropHelper(targetWindow).Handle;            IntPtr wMenu = NativeMethods.GetSystemMenu(window, false);            int command = NativeMethods.TrackPopupMenuEx(wMenu, TPM_LEFTALIGN | TPM_RETURNCMD, x, y, window, IntPtr.Zero);            if (command == 0)                return;            NativeMethods.PostMessage(window, WM_SYSCOMMAND, new IntPtr(command), IntPtr.Zero);        }    }    internal static class NativeMethods    {        [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]        internal static extern IntPtr GetSystemMenu(IntPtr hWnd, bool bRevert);        [DllImport("user32.dll")]        internal static extern int TrackPopupMenuEx(IntPtr hmenu, uint fuFlags, int x, int y, IntPtr hwnd, IntPtr lptpm);        [DllImport("user32.dll")]        internal static extern IntPtr PostMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);        [DllImport("user32.dll")]        internal static extern bool EnableMenuItem(IntPtr hMenu, uint uIDEnableItem, uint uEnable);    }}
 |