GetWindowLong与C#中的GetWindowLongPtr

时间:2008-11-26 03:30:50

标签: c# getwindowlong

我正在使用GetWindowLong:

[DllImport("user32.dll")]
private static extern IntPtr GetWindowLong(IntPtr hWnd, int nIndex);

但根据MSDN文档,我应该使用GetWindowLongPtr与64位兼容。 http://msdn.microsoft.com/en-us/library/ms633584(VS.85).aspx

GetWindowLongPtr的MSDN文档说我应该像这样定义它(在C ++中):

LONG_PTR GetWindowLongPtr(HWND hWnd, int nIndex);

我曾经使用IntPtr作为返回类型,但是我将使用什么来替代LONG_PTR?我也看到GetWindowLong在C#中定义为:

[DllImport("user32.dll")]
private static extern long GetWindowLong(IntPtr hWnd, int nIndex);

什么是正确的,我如何确保正确的64位兼容性?

3 个答案:

答案 0 :(得分:7)

您应该使用IntPtr定义GetWindowLongPtr。在C / C ++中,LONG_PTR在32位系统上是32位,在64位系统上是64位(参见here)。 C#中的IntPtr旨在以相同的方式工作(请参阅here)。

所以你想要的是:

[DllImport("user32.dll")]
private static extern IntPtr GetWindowLongPtr(IntPtr hWnd, int nIndex);

答案 1 :(得分:6)

不幸的是,这并不容易,因为在32位Windows中不存在GetWindowLongPtr。在32位系统上,GetWindowLongPtr只是一个指向GetWindowLong的C宏。如果你真的需要在32位和64位系统上使用GetWindowLongPtr,你必须确定在运行时调用正确的一个。请参阅pinvoke.net

上的说明

答案 2 :(得分:3)

SoapBox是正确的。

此外,如果您需要查看Win32中的类型或函数应该如何编组,请尝试使用PInvoke Interop Assistant。它将内置大多数Win32 API的代,并可以基于代码片段进行自定义生成。