【发布时间】:2020-06-25 18:52:26
【问题描述】:
我正在开发一个需要获取/设置 Win32 窗口位置信息的应用程序。我正在使用 .NET Core 3.1 和 Windows 10 1909。我为 GetWindowPlacement 添加了 P/Invoke 方法和结构:
[DllImport("USER32.DLL")]
public static extern bool GetWindowPlacement(IntPtr hWnd, ref WINDOWPLACEMENT lpwndpl);
[StructLayout(LayoutKind.Sequential)]
public struct RECT
{
public long left;
public long top;
public long right;
public long bottom;
}
[StructLayout(LayoutKind.Sequential)]
public struct WINDOWPLACEMENT
{
public uint length;
public uint flags;
public uint showCmd;
public POINT ptMinPosition;
public POINT ptMaxPosition;
public RECT rcNormalPosition;
public RECT rcDevice;
}
[StructLayout(LayoutKind.Sequential)]
public struct POINT
{
public long x;
public long y;
}
然后我这样称呼它:
var placement = new WINDOWPLACEMENT();
placement.length = (uint)Marshal.SizeOf(placement);
if (GetWindowPlacement(hWnd, ref placement))
{
// do something with placement info
}
Marshall.SizeOf 返回 108 字节的长度,调用似乎成功,但之后放置结构始终将其 length 值设置为 44,RECT 值全部为 0。flags, showCmd 和 POINT 的值很好。我尝试将length 硬编码为其他值,例如 112 或 120 字节或 0 字节,但我总是用length = 44 得到结构体,没有矩形。
我错过了什么?
【问题讨论】: