如何取消WPF表单最小化事件

时间:2012-10-23 02:58:02

标签: c# wpf winforms

我想取消自然最小化行为并改为改变WPF表单大小。

我有一个Window_StateChanged的解决方案,但它看起来不那么好 - 窗口首先被最小化然后跳回并进行大小改变。有没有办法实现这个目标?我用Google搜索了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

2 个答案:

答案 0 :(得分:9)

你需要在表单触发Window_StateChanged之前截取最小化命令,以避免你看到的最小化/恢复舞蹈。我认为最简单的方法是让你的表单监听Windows消息,当收到最小化命令时,取消它并调整表单大小。

在表单构造函数中注册SourceInitialized事件:

this.SourceInitialized += new EventHandler(OnSourceInitialized); 

将这两个处理程序添加到表单中:

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;
} 

我怀疑这是你希望避免的方法,但归结为我所展示的代码并不太难实现。

代码基于this SO question

答案 1 :(得分:0)

尝试这个简单的解决方案:

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;
    }
}