閉じる（×）ボタン無効化

# ×ボタンを押しても閉じられなくする方法

![image02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142879/dba66d83-3551-9d17-00c6-7b8b889dde39.png)

```xml:MainWindow.xaml
<Window
    x:Class="SampleApp1.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:local="clr-namespace:SampleApp1"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    Title="MainWindow"
    Width="300"
    Height="200"
    Closing="Window_Closing"
    ResizeMode="CanResizeWithGrip"
    mc:Ignorable="d">
    <Grid>
        <Button
            Margin="20"
            Click="Button_Click"
            Content="終了" />
    </Grid>
</Window>
```

```csharp:MainWindow.xaml.cs
using System.Windows;

namespace SampleApp1
{
    /// <summary>
    /// MainWindow.xaml の相互作用ロジック
    /// </summary>
    public partial class MainWindow : Window
    {
        /// <summary>
        /// 終了フラグ
        /// </summary>
        public bool IsTerminate { get; set; } = false;

        public MainWindow()
        {
            InitializeComponent();
        }

        /// <summary>
        /// Closeが呼び出された直後
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
        {
            if (IsTerminate)
            {
                // 終了
                return;
            }

            MessageBox.Show("終了できません。");
            // 終了処理をキャンセル
            e.Cancel = true;
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            IsTerminate = true;
            Close();
        }
    }
}
```

# ×ボタンを押せなくする方法

![image03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142879/f3d7c4b6-1e5e-6e54-719b-9b6443f21b07.png)

```xml:MainWindow.xaml
<Window
    x:Class="SampleApp2.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:local="clr-namespace:SampleApp2"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    Title="MainWindow"
    Width="300"
    Height="200"
    ResizeMode="CanResizeWithGrip"
    SourceInitialized="Window_SourceInitialized"
    mc:Ignorable="d">
    <Grid>
        <Button
            Margin="20"
            Click="Button_Click"
            Content="終了" />
    </Grid>
</Window>
```

```csharp:MainWindow.xaml.cs
using System;
using System.Runtime.InteropServices;
using System.Windows;

namespace SampleApp2
{
    /// <summary>
    /// MainWindow.xaml の相互作用ロジック
    /// </summary>
    public partial class MainWindow : Window
    {
        /// <summary>
        /// メニューのハンドル取得
        /// </summary>
        /// <param name="hWnd"></param>
        /// <param name="bRevert"></param>
        /// <returns></returns>
        [DllImport("user32.dll")]
        private static extern IntPtr GetSystemMenu(IntPtr hWnd, bool bRevert);

        /// <summary>
        /// メニュー項目の削除
        /// </summary>
        /// <param name="hMenu"></param>
        /// <param name="uPosition"></param>
        /// <param name="uFlags"></param>
        /// <returns></returns>
        [DllImport("user32.dll")]
        private static extern bool RemoveMenu(IntPtr hMenu, uint uPosition, uint uFlags);

        /// <summary>
        /// ウィンドウを閉じる
        /// </summary>
        private const int SC_CLOSE = 0xf060;

        /// <summary>
        /// uPositionに設定するのは項目のID
        /// </summary>
        private const int MF_BYCOMMAND = 0x0000;

        public MainWindow()
        {
            InitializeComponent();
        }

        /// <summary>
        /// 初期化時
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Window_SourceInitialized(object sender, EventArgs e)
        {
            IntPtr hwnd = new System.Windows.Interop.WindowInteropHelper((Window)sender).Handle;
            IntPtr hMenu = GetSystemMenu(hwnd, false);
            RemoveMenu(hMenu, SC_CLOSE, MF_BYCOMMAND);
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            Close();
        }
    }
}
```