窗口最大化/未最大化时的事件

Mic*_*tum 53 c# winforms

当您最大化表单或取消最大化时,是否会触发事件?

在你说Resize或之前SizeChanged:只有Size实际改变才会被解雇.如果您的窗口大小与最大化窗口大小相等,则它们不会触发.位置看起来是下一个最好的选择,但这再次感觉就像巧合赌博.

Rob*_*cks 61

令人惊讶的是,没有人提到内置的.NET方法.

这样您就不需要覆盖Window Message Processing处理程序.

它甚至可以捕获双击窗口标题栏导致的最大化/恢复事件,而WndProc方法则不会.

将其复制并将其链接到表单上的"Resize"事件处理程序.

    FormWindowState LastWindowState = FormWindowState.Minimized;
    private void Form1_Resize(object sender, EventArgs e) {

        // When window state changes
        if (WindowState != LastWindowState) {
            LastWindowState = WindowState;


            if (WindowState == FormWindowState.Maximized) {

                // Maximized!
            }
            if (WindowState == FormWindowState.Normal) {

                // Restored!
            }
        }

    }
Run Code Online (Sandbox Code Playgroud)

  • 这个答案没有解决实际问题,这个问题是调整大小事件在某些情况下甚至不会触发的事实. (14认同)

Ree*_*sey 44

你可以通过覆盖WndProc来做到这一点:

protected override void WndProc( ref Message m )
{
    if( m.Msg == 0x0112 ) // WM_SYSCOMMAND
    {
        // Check your window state here
        if (m.WParam == new IntPtr( 0xF030 ) ) // Maximize event - SC_MAXIMIZE from Winuser.h
        {
              // THe window is being maximized
        }
    }
    base.WndProc(ref m);
}
Run Code Online (Sandbox Code Playgroud)

这应该在任何窗口上处理事件. SC_RESTORE0xF120SC_MINIMIZE0XF020,如果你需要这些常数也.

  • 您可能会注意到,通过双击标题栏进行最大化时,这不起作用.根据MSDN,"在WM_SYSCOMMAND消息中,wParam参数的四个低位由系统内部使用.为了在测试wParam的值时获得正确的结果,应用程序必须将值0xFFF0与wParam值组合在一起使用按位AND运算符." (http://msdn.microsoft.com/en-us/library/windows/desktop/ms646360(v=vs.85).aspx)因此,比较应为"(m.WParam.ToInt32()&0xFFF0) == 0xF030"或类似的东西. (14认同)
  • int wParam =(m.WParam.ToInt32()&0xFFF0); if(wParam == 0xF030 || wParam == 0xF020 || wParam == 0xF120){DoUpdate(); 为我工作.我也叫base.WndProc(ref m); 之前能够使用更新的窗口参数 (4认同)

Lor*_*ato 13

另一个小的添加,以检查最大化后恢复原始尺寸和位置:

protected override void WndProc(ref Message m)
{
    base.WndProc(ref m);

    // WM_SYSCOMMAND
    if (m.Msg == 0x0112)
    {
        if (m.WParam == new IntPtr(0xF030) // Maximize event - SC_MAXIMIZE from Winuser.h
            || m.WParam == new IntPtr(0xF120)) // Restore event - SC_RESTORE from Winuser.h
        {
            UpdateYourUI();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

希望这有帮助.


816*_*055 5

我遇到了同样的问题,我可以解决它而无需覆盖。因为我有一个处于停靠模式“填充”的PictureBox,所以我可以使用它的SizeChanged事件,该事件也会在最大化窗口时触发。


Gab*_*scu 5

我相信代码比那更简单。您不需要保存 lastState,因为在触发事件时会随时检查 WindowState。

 private void MainForm_Resize(object sender, EventArgs e)
    {
        if (WindowState == FormWindowState.Maximized)
        {
            spContainer.SplitterDistance = 1000;
        }
        if (WindowState == FormWindowState.Normal)
            spContainer.SplitterDistance = 500;
    }
Run Code Online (Sandbox Code Playgroud)