5

自然な最小化動作をキャンセルして、代わりに WPF フォーム サイズを変更したい。

Window_StateChanged を使用した解決策がありますが、見た目が良くありません。最初に最小化されたウィンドウが元に戻り、サイズが変更されます。これを達成する方法はありますか?私は Window_StateChanging をグーグル検索しましたが、それを理解できませんでした。私が使用したくないある種の外部ライブラリです。

それが私が持っているものです:

private void Window_StateChanged(object sender, EventArgs e)
{
    switch (this.WindowState)
    {
        case WindowState.Minimized:
            {
                WindowState = System.Windows.WindowState.Normal;
                this.Width = 500;
                this.Height = 800;
                break;
            }
    }
}

ありがとう、

EP

4

2 に答える 2

13

Window_StateChanged表示されている最小化/復元のダンスを回避するには、フォームが起動する前に最小化コマンドをインターセプトする必要があります。これを行う最も簡単な方法は、フォームに Windows メッセージをリッスンさせ、最小化コマンドを受信したらキャンセルしてフォームのサイズを変更することだと思います。

フォーム コンストラクターでイベントを登録SourceInitializedします。

this.SourceInitialized += new EventHandler(OnSourceInitialized); 

次の 2 つのハンドラーをフォームに追加します。

private void OnSourceInitialized(object sender, EventArgs e) {
    HwndSource source = (HwndSource)PresentationSource.FromVisual(this);
    source.AddHook(new HwndSourceHook(HandleMessages));
} 

private IntPtr HandleMessages(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled) {
    // 0x0112 == WM_SYSCOMMAND, 'Window' command message.
    // 0xF020 == SC_MINIMIZE, command to minimize the window.
    if (msg == 0x0112 && ((int)wParam & 0xFFF0) == 0xF020) {
        // Cancel the minimize.
        handled = true;

        // Resize the form.
        this.Width = 500;
        this.Height = 500;
    }

    return IntPtr.Zero;
} 

これはあなたが避けたいと思っていたアプローチだと思いますが、実装がそれほど難しくないことを示すコードに要約します。

この SO questionに基づくコード。

于 2012-10-23T04:29:54.517 に答える
1

この簡単な解決策を試してください:

public partial class MainWindow : Window
{
    private int SC_MINIMIZE = 0xf020;
    private int SYSCOMMAND = 0x0112;

    public MainWindow()
    {
        InitializeComponent();
        SourceInitialized += (sender, e) =>
                                 {
                                     HwndSource source = HwndSource.FromHwnd(new WindowInteropHelper(this).Handle);
                                     source.AddHook(WndProc);
                                 };
    }

    private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
    {
        // process minimize button
        if (msg == SYSCOMMAND && SC_MINIMIZE == wParam.ToInt32())
        {
            //Minimize clicked
            handled = true;
        }
        return IntPtr.Zero;
    }
}
于 2012-10-23T04:41:10.587 に答える