Windowの最小化、最大化ボタン

ウィンドウの最小化ボタン、最大化ボタンを消して欲しいと要望があったので、後輩に頼んだら難しいという回答が。そんなのプロパティの設定だけだと思ってみてみたら、プロパティが無い。WPFのWindowってMinimizeBoxとかMaximizeBoxが無かったのね。これくらい用意してくれよ・・・と、ぶつぶつ言いながら、やっつけコード。

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

[Flags]
public enum WindowStyleFlag : uint
{
    WS_SYSMENU = 0x00080000,
    WS_MINIMIZEBOX = 0x00020000,
    WS_MAXIMIZEBOX = 0x00010000,
}

public class WindowEx : Window
{
    const int GWL_STYLE = -16;

    [DllImport ("user32")]
    private static extern uint GetWindowLong (IntPtr hWnd,int index);

    [DllImport ("user32")]
    private static extern uint SetWindowLong (IntPtr hWnd,int index, WindowStyleFlag dwLong);

    public static readonly DependencyProperty MinimizeBoxProperty =
        DependencyProperty.Register ("MinimizeBox",typeof (bool),typeof (WindowEx),new PropertyMetadata (true));

    public static readonly DependencyProperty MaximizeBoxProperty =
        DependencyProperty.Register ("MaximizeBox",typeof (bool),typeof (WindowEx),new PropertyMetadata (true));

    public static readonly DependencyProperty ControlBoxProperty =
        DependencyProperty.Register ("ControlBox",typeof (bool),typeof (WindowEx),new PropertyMetadata (true));

    /// <summary>
    /// 最小化ボタン。
    /// </summary>
    public bool MinimizeBox
    {
        get { return (bool)GetValue (MinimizeBoxProperty); }
        set { SetValue (MinimizeBoxProperty,value); }
    }

    /// <summary>
    /// 最大化ボタン。
    /// </summary>
    public bool MaximizeBox
    {
        get { return (bool)GetValue (MaximizeBoxProperty); }
        set { SetValue (MaximizeBoxProperty,value); }
    }

    /// <summary>
    /// システムメニュー。
    /// </summary>
    public bool ControlBox
    {
        get { return (bool)GetValue (ControlBoxProperty); }
        set { SetValue (ControlBoxProperty,value); }
    }

    protected WindowStyleFlag GetWindowStyle (WindowStyleFlag windowStyle)
    {
        WindowStyleFlag style = windowStyle;
        if (MinimizeBox)
            style |= WindowStyleFlag.WS_MINIMIZEBOX;
        else
            style &= ~WindowStyleFlag.WS_MINIMIZEBOX;

        if (MaximizeBox)
            style |= WindowStyleFlag.WS_MAXIMIZEBOX;
        else
            style &= ~WindowStyleFlag.WS_MAXIMIZEBOX;

        if (ControlBox)
            style |= WindowStyleFlag.WS_SYSMENU;
        else
            style &= ~WindowStyleFlag.WS_SYSMENU;

        return style;
    }

    protected override void OnSourceInitialized (EventArgs e)
    {
        base.OnSourceInitialized (e);

        IntPtr handle = (new WindowInteropHelper (this)).Handle;
        WindowStyleFlag original = (WindowStyleFlag)GetWindowLong (handle,GWL_STYLE);
        WindowStyleFlag current = GetWindowStyle (original);
        if (original != current)
            SetWindowLong (handle,GWL_STYLE,current);
    } 
}

WPFはまだまだ痒いところに手が届いていないので、業務アプリに使うのは時期尚早だったなぁ・・・。