我像这样使用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?我也看到在C#中将GetWindowLong定义为:
[DllImport("user32.dll")] private static extern long GetWindowLong(IntPtr hWnd, int nIndex);
什么是正确的,我如何确保正确的64位兼容性?
您应该使用IntPtr定义GetWindowLongPtr.在C/C++中,LONG_PTR在32位系统上为32位,在64位系统上为64位(参见此处).C#中的IntPtr设计为以相同的方式工作(参见此处).
所以你想要的是:
[DllImport("user32.dll")] private static extern IntPtr GetWindowLongPtr(IntPtr hWnd, int nIndex);
不幸的是,这并不容易,因为在32位Windows中不存在GetWindowLongPtr.在32位系统上,GetWindowLongPtr只是一个指向GetWindowLong的C宏.如果你真的需要在32位和64位系统上使用GetWindowLongPtr,你必须确定在运行时调用正确的一个.请参阅pinvoke.net上的说明