【C#,WPF】最大化・最小化・閉じるボタンの非表示設定

【C#,WPF】最大化・最小化・閉じるボタンの非表示設定

WPFでウィンドウを作成している際に、右上の最大化・最小化・閉じるボタンを非表示にしたいときがあります。タイトルバーごと非表示にするには、Windowの「WindowStyle」プロパティを「None」にすればいいですが、今回はタイトルバーを残しつつボタンのみを非表示にする方法を解説します。

サンプルコード(XAML)

<Window x:Class="WindowMenuButtonHidden.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <!-- タイトル表示用ラベル -->
        <Label Content="最大化・最小化・閉じるボタンの非表示設定"
               Margin="10,10,0,0" Width="497" Height="300" FontSize="16"
               HorizontalAlignment="Center" VerticalAlignment="Center"
               HorizontalContentAlignment="Center" VerticalContentAlignment="Center"/>

        <!-- バツボタンを非表示にするので、代わりの終了用ボタンを置いておく -->
        <Button Name="btnClose" Content="終了" HorizontalAlignment="Right" Margin="0,10,10,0"
                VerticalAlignment="Top" Width="75" Click="btnClose_Click"/>
    </Grid>
</Window>

サンプルコード(C#)

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

namespace WindowMenuButtonHidden
{
    /// 
    /// MainWindow.xaml の相互作用ロジック
    /// 
    public partial class MainWindow : Window
    {
        #region "最大化・最小化・閉じるボタンの非表示設定"

        [DllImport("user32.dll")]
        private static extern int GetWindowLong(IntPtr hWnd, int nIndex);

        [DllImport("user32.dll")]
        private static extern int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong);

        const int GWL_STYLE = -16;
        const int WS_SYSMENU = 0x80000;

        protected override void OnSourceInitialized(EventArgs e)
        {
            base.OnSourceInitialized(e);
            IntPtr handle = new WindowInteropHelper(this).Handle;
            int style = GetWindowLong(handle, GWL_STYLE);
            style = style & (~WS_SYSMENU);
            SetWindowLong(handle, GWL_STYLE, style);
        }

        #endregion

        public MainWindow()
        {
            InitializeComponent();
        }

        private void btnClose_Click(object sender, RoutedEventArgs e)
        {
            this.Close();
        }
    }
}

解説

重要な箇所は、MainWindow.xaml.csの13〜33行目、「#region 」で囲んだ部分です。
ここを丸ごとウィンドウのクラス内に追加することで、最大化・最小化・閉じるボタンが非表示となります。
また、これらの処理は「System.Runtime.InteropServices」「System.Windows.Interop」の参照が必要なので、csファイルの先頭(3~4行目)でusingしています。

サンプルプロジェクト

GitHubに今回のサンプルプロジェクト一式をアップロードしています。
GitHub – Kuwayoshi/WindowMenuButtonHidden
実際に動かして確認したい方などは、上記ページからダウンロードしてください。

まとめ

タイトルバーを表示しつつ、右上のボタンを非表示にする方法を紹介しました。
「最大化・最小化・閉じるなどの動作を禁止したいけど、タイトルバーのドラッグによるウィンドウ移動は残したい」といったときなどに、ご活用ください。


スポンサーリンク

2 thoughts on “【C#,WPF】最大化・最小化・閉じるボタンの非表示設定

  1. ピンバック: WPFアプリでタイトルバーの最小化、最大化、閉じるを消す方法 | 生涯エンジニア宣言

  2. ピンバック: WPF 閉じるボタンのみを非表示にしたウィンドウの作り方 | コーヒー飲みながら仕事したい

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください