当窗口最大化/不最大化时的事件
当您最大化一个表单或取消最大化时是否有事件被触发?
在你说Resize
或SizeChanged
之前:只有Size
实际上改变才会被触发。 如果你的窗户大小与最大化的窗户大小相同,他们不会开火。 地点看起来像下一个最好的赌注,但这再次感觉就像赌博的巧合。
你可以通过覆盖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_RESTORE
是0xF120
,而SC_MINIMIZE
是0XF020
。
令人惊讶的是,没有人提到内置的.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! } } }
另一个小的补充,以检查恢复到最大化后的原始维度和位置:
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(); } } }
希望这个帮助。
我也有同样的问题,我可以解决它,而不是压倒一切。 因为我有一个PictureBox在docker模式“填充”我可以使用它的SizeChanged事件,这也激发了最大化窗口。
如果没有明显的事件需要监听,那么您可能需要挂钩到Windows API并捕获相应的消息(Google发现您需要拦截WM_SYSCOMMAND消息: http://www.codeguru。 com / forum / archive / index.php / t-234554.html )。
我相信代码比这更简单。 您不需要保存lastState,因为在触发事件的任何时候都会检查WindowState。
private void MainForm_Resize(object sender, EventArgs e) { if (WindowState == FormWindowState.Maximized) { spContainer.SplitterDistance = 1000; } if (WindowState == FormWindowState.Normal) spContainer.SplitterDistance = 500; }
我希望这部分代码将会有用。
if (m.Msg == User32.WM_WINDOWPOSCHANGING && IsHandleCreated) { User32.WINDOWPLACEMENT wp = new User32.WINDOWPLACEMENT(); wp.length = Marshal.SizeOf(typeof(User32.WINDOWPLACEMENT)); User32.GetWindowPlacement(Handle, ref wp); switch (wp.showCmd) { case User32.SW_RESTORE: case User32.SW_NORMAL: case User32.SW_SHOW: case User32.SW_SHOWNA: case User32.SW_SHOWNOACTIVATE: _windState = FormWindowState.Normal; if (wp.showCmd == User32.SW_RESTORE) Update(); break; case User32.SW_SHOWMAXIMIZED: _windState = FormWindowState.Maximized; SetMaximumSize(); break; case User32.SW_SHOWMINIMIZED: case User32.SW_MINIMIZE: case User32.SW_SHOWMINNOACTIVE: _windState = FormWindowState.Minimized; break; } } private void SetMaximumSize() { Screen screen = Screen.FromControl(this); if (screen != null && !screen.WorkingArea.IsEmpty) { int sizeDiff = this.Size.Width - this.ClientSize.Width; var maxSize = new Size(screen.WorkingArea.Width + sizeDiff, screen.WorkingArea.Height + sizeDiff); this.MaximumSize = maxSize; } } #region Window State public const int SW_NORMAL = 1, SW_SHOWMINIMIZED = 2, SW_SHOWMAXIMIZED = 3, SW_SHOWNOACTIVATE = 4, SW_SHOW = 5, SW_MINIMIZE = 6, SW_SHOWMINNOACTIVE = 7, SW_SHOWNA = 8, SW_RESTORE = 9; #endregion Window State
' 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
我在这里是一个新手,所以不允许评论,但这是对GeoTarget干净的答案的评论:
第一行OUGHT稍微改变为空,如果表单被启动,则被捕获最小化:
FormWindowState? LastWindowState = null;
还有一个平庸的build议:将LastWindowState的赋值移到“if” 之后 ,这样用户不仅可以轻松地检查你到达的内容,还可以检查它来自哪里:
FormWindowState? LastWindowState = null; private void Form1_Resize(object sender, EventArgs e) { // When window state changes if (WindowState != LastWindowState) { if (WindowState == FormWindowState.Maximized) { // Maximized! } if (WindowState == FormWindowState.Normal) { // Restored! } LastWindowState = WindowState; } }