c#

【WPF】タイトルバーダブルクリックで画面サイズを変更させない方法

今回小ハマリしたのは、
『WPFでWindowsサイズを変更しない設定しても、1度だけサイズ変更できてしまう』
です。

通常、WindowのResizeMode=”NoResize”とすると、最小化や最大化のボタンは表示されず、Windowサイズも変更できなくなる。
当然タイトルバーのダブルクリックでもサイズ変更不可となる。。。はず。

しかし、なぜかタイトルバーをダブルクリックすると一度だけサイズ変更できてしまう。
こんな感じ↓

【起動時】フルサイズとなっている。
【起動時】フルサイズとなっている。

 

【ダブルクリック時】サイズ変更される。
【ダブルクリック時】サイズ変更される。

 
この事象を対策する。


対策方法

この事象の対策は、プロパティの見直しではできなかった。
結果から言うと、対策方法はWndProcでメッセージを制御する方法となる。

 
WPFの場合は、Windowsフォームと違ってWndProcをオーバーライドするだけでは使えない。
WndProcを自作し、初期化時にフックする必要がある。

using System;
using System.Windows;
using System.Windows.Interop;

namespace WpfApplication1
{
    public partial class CannotChangeWindowSize : Window
    {
        public CannotChangeWindowSize()
        {
            InitializeComponent();
            SourceInitialized += new EventHandler(CannotChangeWindowSize_SourceInitialized);
        }

        //WndProcをフックする
        private void CannotChangeWindowSize_SourceInitialized(object sender, EventArgs e)
        {
            HwndSource source = HwndSource.FromHwnd(new WindowInteropHelper(this).Handle);
            source.AddHook(new HwndSourceHook(WndProc));
        }

        //非クライアント領域のダブルクリック
        const int WM_NCLBUTTONDBLCLK = 0xA3;

        private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
        {
            //タイトルバーダブルクリックは捨てる
            if (msg == WM_NCLBUTTONDBLCLK)
            {
                handled = true;
            }
            return IntPtr.Zero;
        }
    }
}

これで実行すると、無事にサイズ変更不可となった。

めでたしめでたし。

コメントを残す

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