【问题标题】:Correct length for WINDOWPLACEMENT structWINDOWPLACEMENT 结构的正确长度
【发布时间】: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, showCmdPOINT 的值很好。我尝试将length 硬编码为其他值,例如 112 或 120 字节或 0 字节,但我总是用length = 44 得到结构体,没有矩形。

我错过了什么?

【问题讨论】:

    标签: c# winapi pinvoke


    【解决方案1】:

    <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;
    

    所以它的大小是3*sizeof(UINT)+2*sizeof(POINT)+1*sizeof(RECT),没有定义_MAC,再加上一个RECT,定义了_MAC

    所以它是 44,_MAC 上是 60(见 What's with "#ifdef _MAC" in Windows header files?

    所以你应该在没有RECT rcDevice的情况下定义它

    另一个错误是C#long是8个字节,POINTRECT中需要int

    解决这两个问题,您将拥有 44 个。

    【讨论】:

    • 是的,long 不匹配是我的错。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2022-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-13
    • 2017-05-08
    相关资源
    最近更新 更多