40 lines
921 B
C#
40 lines
921 B
C#
|
using System;
|
||
|
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;
|
||
|
int y;
|
||
|
try
|
||
|
{
|
||
|
x = Convert.ToInt32(menuLocation.X);
|
||
|
y = Convert.ToInt32(menuLocation.Y);
|
||
|
}
|
||
|
catch (OverflowException)
|
||
|
{
|
||
|
x = 0;
|
||
|
y = 0;
|
||
|
}
|
||
|
uint msg = 274u;
|
||
|
uint num = 0u;
|
||
|
uint num2 = 256u;
|
||
|
IntPtr handle = new WindowInteropHelper(targetWindow).Handle;
|
||
|
IntPtr systemMenu = NativeMethods.GetSystemMenu(handle, bRevert: false);
|
||
|
int num3 = NativeMethods.TrackPopupMenuEx(systemMenu, num | num2, x, y, handle, IntPtr.Zero);
|
||
|
if (num3 != 0)
|
||
|
{
|
||
|
NativeMethods.PostMessage(handle, msg, new IntPtr(num3), IntPtr.Zero);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|