如何在子类化发生之前找出用户是否试图最大化窗口?

问题描述 投票:0回答:1

我正在尝试以子类形式捕获一条消息并从中创建一个新事件,这样我就可以在它发生之前检查事情,然后在需要时取消消息。

我想知道用户是否试图最大化表单,然后基于全局变量,将消息传递给基础。

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
结构中没有得到任何好的数据。

我做错了什么?

c# winforms subclassing
1个回答
0
投票

您可以使用表单的 on resize 事件处理程序来检查用户何时尝试最大化表单窗口。 在您的构造函数中注册在调整表单大小时调用的事件处理程序。

Resize += Form1_Resize;

然后在实际的事件处理程序中,相应地检查窗口状态并执行您的逻辑。

private void Form1_Resize(object? sender, EventArgs e)
        {
            if(WindowState== FormWindowState.Maximized)
            {
                //TO DO
            }
        }
© www.soinside.com 2019 - 2024. All rights reserved.