using System;
using System.Runtime.InteropServices;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Interop;

namespace FSI.Lib.Wpf.Ctrls
{
    /// <summary>
    /// Interaktionslogik für ChbWindowsTopMost.xaml
    /// </summary>
    public partial class ChbWindowsTopMost : UserControl
    {
        private Window _window;

        //A window receives this message when the user chooses a command from the Window menu, or when the user chooses the maximize button, minimize button, restore button, or close button.
        public const Int32 WM_SYSCOMMAND = 0x112;

        //Draws a horizontal dividing line.This flag is used only in a drop-down menu, submenu, or shortcut menu.The line cannot be grayed, disabled, or highlighted.
        public const Int32 MF_SEPARATOR = 0x800;

        //Specifies that an ID is a position index into the menu and not a command ID.
        public const Int32 MF_BYPOSITION = 0x400;

        //Specifies that the menu item is a text string.
        public const Int32 MF_STRING = 0x0;

        //Menu Ids for our custom menu items
        public const Int32 _ItemTopMostId = 1000;
        
        [DllImport("user32.dll")]
        private static extern IntPtr GetSystemMenu(IntPtr hWnd, bool bRevert);

        [DllImport("user32.dll")]
        private static extern bool InsertMenu(IntPtr hMenu, Int32 wPosition, Int32 wFlags, Int32 wIDNewItem, string lpNewItem);

        public ChbWindowsTopMost()
        {
            InitializeComponent();
            Loaded += ChbWindowsTopMost_Loaded;
        }

        private void ChbWindowsTopMost_Loaded(object sender, RoutedEventArgs e)
        {
            _window = Window.GetWindow(this);

            IntPtr windowhandle = new WindowInteropHelper(_window).Handle;
            HwndSource hwndSource = HwndSource.FromHwnd(windowhandle);

            //Get the handle for the system menu
            IntPtr systemMenuHandle = GetSystemMenu(windowhandle, false);

            //Insert our custom menu items
            InsertMenu(systemMenuHandle, 5, MF_BYPOSITION | MF_SEPARATOR, 0, string.Empty); //Add a menu seperator
            InsertMenu(systemMenuHandle, 6, MF_BYPOSITION, _ItemTopMostId, "immer im Vordergrund"); //Add a setting menu item

            hwndSource.AddHook(new HwndSourceHook(WndProc));
        }
        private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
        {
            // Check if the SystemCommand message has been executed
            if (msg == WM_SYSCOMMAND)
            {
                //check which menu item was clicked
                switch (wParam.ToInt32())
                {
                    case _ItemTopMostId:
                        _window.Topmost = !_window.Topmost;
                        chbTopMost.IsChecked = _window.Topmost;
                        handled = true;
                        break;

                }
            }

            return IntPtr.Zero;
        }

        private void CheckBox_Checked(object sender, RoutedEventArgs e)
        {
            _window.Topmost = true;
        }

        private void CheckBox_Unchecked(object sender, RoutedEventArgs e)
        {
            _window.Topmost = false;
        }
    }
}
