我尝试在子类形式中捕获消息,并从中创建一个新事件,以便在事件发生之前进行检查,然后在需要时取消消息。
我想知道用户是否试图最大化表单,然后基于全局变量,沿着消息传递给基类。
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
结构中没有得到任何好的数据。
我做错了什么?
1条答案
按热度按时间6qfn3psc1#
检查窗口的消息WM_SYSCOMMAND。
当用户从“窗口”菜单(以前称为“系统”或“控制”菜单)中选择命令,或者当用户选择“最大化”按钮、“最小化”按钮、“还原”按钮或“关闭”按钮时,窗口会收到此消息。
然后检查WParam属性,查看它是否等于SC_MAXIMIZE,以确定是否已发出最大化窗口请求。