winforms 我怎样才能发现用户是否在使用子类化之前尝试最大化窗口?

mzsu5hc0  于 2023-04-21  发布在  其他
关注(0)|答案(1)|浏览(92)

我尝试在子类形式中捕获消息,并从中创建一个新事件,以便在事件发生之前进行检查,然后在需要时取消消息。
我想知道用户是否试图最大化表单,然后基于全局变量,沿着消息传递给基类。

public class APIConstants
{
    public const uint SWP_NOSIZE = 0x0001;
}

public class APIs
{
    [DllImport("kernel32", CharSet = CharSet.Auto)]
    public static extern void CopyMemory(WINDOWPOS pDst, IntPtr pSrc, int ByteLen);
}

public class Structures
{
    [StructLayout(LayoutKind.Sequential)]
    public struct WINDOWPOS
    {
        public IntPtr hwnd;
        public IntPtr hwndInsertAfter;
        public int x;
        public int y;
        public int cx;
        public int cy;
        public uint flags;
    }
}

当前如何子类化窗体...

protected override void WndProc(ref Message m)
{
    WinMsgs msg = new WinMsgs(m.Msg);

    switch (msg.Message)
    {
        case WinMsgs.WinMessages.WM_WINDOWPOSCHANGING:
            Structures.WINDOWPOS wPos = new Structures.WINDOWPOS();
            APIs.CopyMemory(wPos, m.LParam, Marshal.SizeOf(wPos));
            if ((wPos.flags & APIConstants.SWP_NOSIZE) != 0)
            {
                Debug.WriteLine("NOSIZE");
            }

            break;
    }
}

阅读周围的内容,我认为关键是查看随消息传递的标志是否包含SWP_NOSIZE。我的表单的FormBorderStyle为FixedSingle(不确定这是否会影响结果)。但由于某种原因,我感觉在用CopyMemory填充的wPos结构中没有得到任何好的数据。
我做错了什么?

6qfn3psc

6qfn3psc1#

检查窗口的消息WM_SYSCOMMAND
当用户从“窗口”菜单(以前称为“系统”或“控制”菜单)中选择命令,或者当用户选择“最大化”按钮、“最小化”按钮、“还原”按钮或“关闭”按钮时,窗口会收到此消息。
然后检查WParam属性,查看它是否等于SC_MAXIMIZE,以确定是否已发出最大化窗口请求。

protected override void WndProc(ref Message m)
{
    const Int32 WM_SYSCOMMAND = 0x112;
    const Int32 SC_MAXIMIZE = 0xF030;

    if (m.Msg == WM_SYSCOMMAND && m.WParam.ToInt32() == SC_MAXIMIZE)
    {
        // do what you need to before maximizing
    }

    base.WndProc(ref m); // let the base class process the message
}

相关问题