在 SW_MAXIMIZE 上防止表单调整大小

Prevent Form resize on SW_MAXIMIZE

我想自己模拟 Aero Snap 功能。为了将 Form 粘贴到屏幕一侧,我使用了来自此 question 的解决方案。 问题是我打电话后:

ShowWindow(Handle, SW_MAXIMIZE);

Form 立即最大化并在调用后 MoveWindow 将其大小更改为所需大小。 Form 的这种跳转是可见且烦人的。为了防止它,我试图禁用 WndProc 中消息 WM_GETMINMAXINFO, WM_SIZE, WM_MOVE, WM_NCCALCSIZE, WM_WINDOWPOSCHANGING, WM_WINDOWPOSCHANGED 的处理。它有帮助但不完全。 Form 调整大小是否有任何模拟 SuspendLayout()/ResumeLayout()

WndProc 中禁用消息处理帮助我减少了闪烁(WM_NCPAINT 除外):

bool ignoreMessages = false;

public void DockWindow()
{
    ignoreMessages = true;
    ShowWindow(handle, SW_MAXIMIZE);
    ignoreMessages = false;
    MoveWindow(handle, 0, 0, Screen.PrimaryScreen.WorkingArea.Width / 2, Screen.PrimaryScreen.WorkingArea.Height, true);
}

protected override void WndProc(ref Message message)
{
    if (ignoreMessages &&
        message.Msg != WM_NCPAINT)
        return;

    base.WndProc(ref message);
}