views:

144

answers:

1

I have non-rectangular transparent window with custom style.

<Window
    x:Class="TestWindow" x:Name="Window"
    Width="350" Height="450"  AllowsTransparency="True"  WindowStyle="None"
WindowStartupLocation="CenterScreen" FontSize="14 px" FontFamily="Fonts/#Tahoma" 
Background="Transparent">

I have a grid for title and system buttons and want to show application menu by right click on it. Currently app menu showing only by pressing ALT+Spacebar. How can i solve this problem?

+1  A: 

So, after a two hours of searching i find a solution.

First, we need to define RECT structure.

 [StructLayout(LayoutKind.Sequential)]
 public struct RECT
     {
          public int Left;
          public int Top;
          public int Right;
          public int Bottom;
     }

Then import two user32.dll functions:

[DllImport("user32.dll")]
private static extern IntPtr GetSystemMenu(IntPtr hWnd, bool bRevert);

[DllImport("user32.dll")]
public static extern int TrackPopupMenu(int hMenu, int wFlags, int x, int y, int nReserved, int hwnd, ref RECT lprc);

And now we write our right click on header event handler.

private void headerArea_PreviewMouseDown(object sender, MouseButtonEventArgs e)
       {               
          switch (e.ChangedButton)
            {
              case MouseButton.Right:
                   {
                      // need to get handle of window
                      WindowInteropHelper _helper = new WindowInteropHelper(this);

                      //translate mouse cursor porition to screen coordinates
                      Point p = PointToScreen(e.GetPosition(this));

                      //get handler of system menu
                      IntPtr systemMenuHandle = GetSystemMenu(_helper.Handle, false);

                      RECT rect = new RECT();
                      // and calling application menu at mouse position.
                      int menuItem = TrackPopupMenu(systemMenuHandle.ToInt32(), 1,(int)p.X, (int) p.Y, 0, _helper.Handle.ToInt32(), ref rect);
                      break;
                   }                   
             }   
       }

May be it isn't best way to solve my problem, so i wiil be happy if someone show me another way.

raeno