0

我正在尝试使用 P/Invoke 在 C# 中调用 WinAPI 函数 CalculatePopupWindowPosition。从

http://msdn.microsoft.com/en-us/library/windows/desktop/dd565861(v=vs.85).aspx

我看到它的语法是:

BOOL WINAPI CalculatePopupWindowPosition(  
  _In_      const POINT *anchorPoint,  
  _In_      const SIZE *windowSize,  
  _In_      UINT flags,  
  _In_opt_  RECT *excludeRect,  
  _Out_     RECT *popupWindowPosition  
);

然后我尝试在 C# 中使用以下代码导入它

[DllImport("User32.dll", SetLastError = true, CallingConvention = CallingConvention.StdCall)]
public static extern bool CalculatePopupWindowPosition
(
    [In] ref POINT anchorPoint,
    [In] ref SIZE windowSize,
    [In] ref UInt32 flags,
    [In,Optional] ref RECT excludeRect,
    [Out] out SIZE popupWindowPosition
);

我还实现了RECT,POINTSIZE结构并对其进行了初始化。最后我像这样调用了这个函数。

CalculatePopupWindowPosition(ref nIconPos, ref windowSize, ref flags, ref nIconRect, out windowSize);

这似乎不起作用,windowSize 只包含零,它不应该包含零。有什么想法我在这里做错了吗?

4

1 回答 1

2

flags参数需要通过值而不是引用传递:

[DllImport("User32.dll", SetLastError = true)]
public static extern bool CalculatePopupWindowPosition
(
    ref POINT anchorPoint,
    ref SIZE windowSize,
    uint flags,
    ref RECT excludeRect,
    out RECT popupWindowPosition
);

一些一般性的建议。当 API 调用失败时,检查返回值。在这种情况下,如果函数返回 false,则调用Marshal.GetLastWin32Error以找出错误状态代码。

于 2013-05-12T19:43:54.443 回答