从C#调用Win32 CalculatePopupWindowPosition

时间:2013-05-12 18:23:47

标签: c# .net winapi pinvoke

我正在尝试使用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
);

我还实施了RECTPOINTSIZE结构并对其进行了初始化。最后我调用了这个函数。

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

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

1 个答案:

答案 0 :(得分:1)

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

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

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