我正在尝试以子类形式捕获一条消息并从中创建一个新事件,这样我就可以在它发生之前检查事情,然后在需要时取消消息。
我想知道用户是否试图最大化表单,然后基于全局变量,将消息传递给基础。
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
结构中没有得到任何好的数据。
我做错了什么?
您可以使用表单的 on resize 事件处理程序来检查用户何时尝试最大化表单窗口。 在您的构造函数中注册在调整表单大小时调用的事件处理程序。
Resize += Form1_Resize;
然后在实际的事件处理程序中,相应地检查窗口状态并执行您的逻辑。
private void Form1_Resize(object? sender, EventArgs e)
{
if(WindowState== FormWindowState.Maximized)
{
//TO DO
}
}