检查当前最小化 window 在最小化时是否处于最大化或正常状态
Check if currently minimized window was in maximized or normal state at the time of minimization
如何区分当前最小化的 window 是否在此之前最大化,而不是 C#/WinForms 中的正常状态?
if (WindowState == FormWindowState.Minimized)
{
Properties.Settings.Default.Location = RestoreBounds.Location;
Properties.Settings.Default.Size = RestoreBounds.Size;
Properties.Settings.Default.IsMaximized = ...; // How do I know if the window would be restored to maximized?
}
我想使用应用程序设置使我的 window 的位置和状态持久化,我正在关注 但如果 window 在关闭时被最小化我不希望它在下一个应用程序启动时开始最小化(这是目前的答案)。
我想要的是 window 如果它在最小化时已经最大化,则开始最大化,如果它在最小化时处于正常状态,则以正常状态开始最小化。
WinForms 不会公开任何 WindowStateChanged
事件,因此您必须自己跟踪它。 Windows 将在表单状态更改时发送 WM_SYSCOMMAND
:
partial class MyForm : Form
{
public MyForm()
{
InitializeComponent();
_isMaximized = WindowState == FormWindowState.Maximized;
}
protected override void WndProc(ref Message m)
{
if (m.Msg == WM_SYSCOMMAND)
{
int wparam = m.WParam.ToInt32() & 0xfff0;
if (wparam == SC_MAXIMIZE)
_isMaximized = true;
else if (wparam == SC_RESTORE)
_isMaximized = false;
}
base.WndProc(ref m);
}
private const int WM_SYSCOMMAND = 0x0112;
private const int SC_MAXIMIZE = 0xf030;
private const int SC_RESTORE = 0xf120;
private bool _isMaximized;
}
您可以在最小化的 window 上使用 GetWindowPlacement
(本机 Win32 API 函数),并从 WindowPlacement 结构中读回 Flags 成员。如果设置了位 0x02,则 window 在最小化之前被最大化。
如何区分当前最小化的 window 是否在此之前最大化,而不是 C#/WinForms 中的正常状态?
if (WindowState == FormWindowState.Minimized)
{
Properties.Settings.Default.Location = RestoreBounds.Location;
Properties.Settings.Default.Size = RestoreBounds.Size;
Properties.Settings.Default.IsMaximized = ...; // How do I know if the window would be restored to maximized?
}
我想使用应用程序设置使我的 window 的位置和状态持久化,我正在关注 但如果 window 在关闭时被最小化我不希望它在下一个应用程序启动时开始最小化(这是目前的答案)。
我想要的是 window 如果它在最小化时已经最大化,则开始最大化,如果它在最小化时处于正常状态,则以正常状态开始最小化。
WinForms 不会公开任何 WindowStateChanged
事件,因此您必须自己跟踪它。 Windows 将在表单状态更改时发送 WM_SYSCOMMAND
:
partial class MyForm : Form
{
public MyForm()
{
InitializeComponent();
_isMaximized = WindowState == FormWindowState.Maximized;
}
protected override void WndProc(ref Message m)
{
if (m.Msg == WM_SYSCOMMAND)
{
int wparam = m.WParam.ToInt32() & 0xfff0;
if (wparam == SC_MAXIMIZE)
_isMaximized = true;
else if (wparam == SC_RESTORE)
_isMaximized = false;
}
base.WndProc(ref m);
}
private const int WM_SYSCOMMAND = 0x0112;
private const int SC_MAXIMIZE = 0xf030;
private const int SC_RESTORE = 0xf120;
private bool _isMaximized;
}
您可以在最小化的 window 上使用 GetWindowPlacement
(本机 Win32 API 函数),并从 WindowPlacement 结构中读回 Flags 成员。如果设置了位 0x02,则 window 在最小化之前被最大化。