我正在尝试使用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
,POINT
和SIZE
结构并对其进行了初始化。最后我调用了这个函数。
CalculatePopupWindowPosition(ref nIconPos, ref windowSize, ref flags, ref nIconRect, out windowSize);
这似乎不起作用,windowSize只包含零,它不应该包含零。我在这里做错了什么想法?
答案 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
以找出错误状态代码。