我正在开发一个需要获取/设置Win32窗口放置信息的应用程序。我使用的是WindowsCore3.1和.NET 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
且没有矩形的结构。
我遗漏了什么?
发布于 2020-06-25 19:04:50
在<Windows.h>
中,该结构定义如下:
typedef struct tagWINDOWPLACEMENT {
UINT length;
UINT flags;
UINT showCmd;
POINT ptMinPosition;
POINT ptMaxPosition;
RECT rcNormalPosition;
#ifdef _MAC
RECT rcDevice;
#endif
} WINDOWPLACEMENT;
typedef WINDOWPLACEMENT *PWINDOWPLACEMENT, *LPWINDOWPLACEMENT;
所以它的大小是没有定义_MAC
的3*sizeof(UINT)+2*sizeof(POINT)+1*sizeof(RECT)
,再加上一个定义了_MAC
的RECT
。
因此是44,在_MAC
上是60 (参见What's with "#ifdef _MAC" in Windows header files?)
因此您应该在不使用RECT rcDevice
的情况下定义它
另一个错误是C# long
是8字节的,你需要在POINT
和RECT
中使用int
。
两个都修好了,你就有44个了。
https://stackoverflow.com/questions/62582387
复制相似问题