限制Form的启动行为

时间:2019-02-06 17:17:42

标签: c# winforms

我的应用程序中有一个启动屏幕,我想使用StartupPosition = CenterScreen和WindowState = Normal来显示。一切正常,但是,例如,如果用户创建了我的应用程序的快捷方式并设置Run = Maximized,则启动屏幕将变为最大化而不是正常的屏幕,并且我想禁用此行为。有什么方法可以完全禁止表单最大化或覆盖赋予应用程序的启动状态?

我尝试强制使用StartupPosition和WindowState,但这不起作用,因为窗口仅停留在屏幕的左上角。

做一些测试,我发现有两种方法可以使窗口在启动时由于Run = Maximized而无法最大化: A)显示一个虚拟表单,将其关闭,然后加载实际的启动表单 B)添加以下Form.Load:

if (WindowState != FormWindowState.Normal)
{
    WindowState = FormWindowState.Normal;
    Rectangle r = Screen.GetWorkingArea(this);
    Location = new Point(r.X + ((r.Width - Width) / 2), r.Y + ((r.Height - Height) / 2));
}

我知道应该有一种禁止表单最大化的实际方法,因为如果我在启动表单之前显示消息框,则消息框会正常显示,然后启动表单也会显示,但是在启动时不显示消息框屏幕要最大化。

1 个答案:

答案 0 :(得分:1)

谢谢@LarsTech!答案介于Application stuck in full screen?和@Jimi的解决方案之间。这样做的好处是可以禁用“运行=最大化”而不禁用“运行=最小化”。

using System.Runtime.InteropServices;
public partial class frmStartup : Form
{
    public frmStartup()
    {
        InitializeComponent();
    }

    protected override void WndProc(ref Message m)
    {
        if (m.Msg == 0x46) // WM_WINDOWPOSCHANGING
        {
            var wpos = (WINDOWPOS)Marshal.PtrToStructure(m.LParam, typeof(WINDOWPOS));
            wpos.flags |= 0x0001; // Turn on SWP_NOSIZE
            Marshal.StructureToPtr(wpos, m.LParam, false);
        }
        base.WndProc(ref m);
    }
    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
    private struct WINDOWPOS
    {
        public IntPtr hwnd, hwndInsertAfter;
        public int x, y, cx, cy;
        public int flags;
    }

    private void frmStartup_Load(object sender, EventArgs e)
    {
        if (WindowState == FormWindowState.Maximized)
        {
            WindowState = FormWindowState.Normal;
        }
    }
}