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

时间:2009-08-18 19:34:16

标签: c# winforms

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

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

10 个答案:

答案 0 :(得分:58)

没有人提到内置的.NET方法。

这样您就不需要覆盖窗口消息处理处理程序。

它甚至可以捕获双击窗口标题栏导致的最大化/恢复事件,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!
            }
        }

    }

答案 1 :(得分:41)

您可以通过覆盖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);
}

这应该在任何窗口上处理事件。如果您需要这些常量,则SC_RESTORE0xF120SC_MINIMIZE0XF020

答案 2 :(得分: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();
        }
    }
}

希望得到这个帮助。

答案 3 :(得分:4)

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

答案 4 :(得分:4)

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

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

答案 5 :(得分:1)

如果没有明显的事件需要监听,您可能需要挂钩到Windows API并捕获相应的消息(Google发现您需要拦截WM_SYSCOMMAND消息:http://www.codeguru.com/forum/archive/index.php/t-234554.html )。

答案 6 :(得分:1)

我希望这部分代码有用。

function arrayMaximalAdjacentDifference(arr) {
    var dif = 0;
    var max = 0;
    for(var i = 0; i < arr.length; i++){
        dif = Math.abs(arr[i] - arr[i+1]);
        if(dif > max){
            max = dif;
        }
    }
    return max;
}

答案 7 :(得分:0)

' Great tip. So if it helps to VisualBasic In Code
Private Const WM_SYSCOMMAND As Integer = &H112
Private Const SC_MAXIMIZE As Integer = &HF030
' # WndProcess 루프함수
Protected Overrides Sub WndProc(ByRef m As Message)
    If m.Msg.Equals(WM_SYSCOMMAND) Then
        If (m.WParam.ToInt32.Equals(SC_MAXIMIZE)) Then
            Me.p_FullScreen()
            Return
        End If
    End If

    MyBase.WndProc(m)
End Sub

答案 8 :(得分:0)

我是新手,所以评论不允许,但这是对GeoTarget的干净答案的评论:

将第一行OUGHT略微更改为可为空,以便在表单启动时捕获最小化:

.glyphicon-map-marker{
    position:absolute;
    z-index:1000;
    top:30%;
    left:2%;
}
a.glyphicon-map-marker
{
     text-decoration: none !important;
}

一个平庸的建议:在“if”之后将LastWindowState的赋值移动到,这样用户不仅可以轻松检查您的内容,还可以检查它的来源:

FormWindowState? LastWindowState = null;

答案 9 :(得分:0)

一个完整的解决方案,可以最大化,最小化,恢复和正确删除仅用于内部目的的低位比特。

protected override void WndProc(ref Message m)
{
    const int WM_SYSCOMMAND = 0x0112;
    const int SC_MAXIMIZE = 0xF030;
    const int SC_MINIMIZE = 0xF020;
    const int SC_RESTORE = 0xF120;

    // dependig on the needs may be called before, after or even never (see below)
    // base.WndProc(ref m);

    if (m.Msg == WM_SYSCOMMAND)
    {
        /// <see cref="https://docs.microsoft.com/en-us/windows/win32/menurc/wm-syscommand"/>
        /// Quote:
        /// In WM_SYSCOMMAND messages, the four low - order bits of the wParam parameter 
        /// are used internally by the system.To obtain the correct result when testing 
        /// the value of wParam, an application must combine the value 0xFFF0 with the 
        /// wParam value by using the bitwise AND operator.
        int wParam = (m.WParam.ToInt32() & 0xFFF0);

        Debug.WriteLine($"Received param: { Convert.ToString(wParam, 16) } ");

        if (wParam == SC_MAXIMIZE)
        {

        }

        if (wParam == SC_MINIMIZE)
        {

        }

        if (wParam == SC_RESTORE)
        {

        }
    }

    // don't use when above call is uncommented
    base.WndProc(ref m);
}