GetWindowLongPtr (user32)
Last changed: -202.74.138.1

.
Summary

32 Bit Windows

On this platform this function is in fact a macro that calls GetWindowLong, so the EntryPoint property has to be set to the real function:

C# Signature:

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

VB .NET Signature:

<DllImport("user32.dll", EntryPoint:="GetWindowLong")> _
Private Shared Function GetWindowLongPtr(ByVal hWnd As HandleRef, ByVal nIndex As Integer) As IntPtr
End Function

64 Bit Windows

On this platform the actual function is called

C# Signature:

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

VB .NET Signature:

<DllImport("user32.dll", EntryPoint:="GetWindowLongPtr")> _
Private Shared Function GetWindowLongPtr(ByVal hWnd As HandleRef, ByVal nIndex As Integer) As IntPtr
End Function

User-Defined Types:

To access the values referred to on MSDN declare the following enumeration.

C# enumeration:

public enum GWL
{
     GWL_WNDPROC =    (-4),
     GWL_HINSTANCE =  (-6),
     GWL_HWNDPARENT = (-8),
     GWL_STYLE =      (-16),
     GWL_EXSTYLE =    (-20),
     GWL_USERDATA =   (-21),
     GWL_ID =     (-12)
}

Notes:

None.

Tips & Tricks:

To make your code work on both Win32 and Win64, you can detect the size of IntPtr, and call the appropriate function. You will have to give the two functions different names, of course.

C# Sample:

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

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

// This static method is required because Win32 does not support
// GetWindowLongPtr directly
public static IntPtr GetWindowLongPtr(IntPtr hWnd, int nIndex)
{
     if (IntPtr.Size == 8)
     return GetWindowLongPtr64(hWnd, nIndex);
     else
     return GetWindowLongPtr32(hWnd, nIndex);
}

VB.NET Sample

<DllImport("user32.dll", EntryPoint:="GetWindowLong")> _
Private Shared Function GetWindowLongPtr32(ByVal hWnd As HandleRef, ByVal nIndex As Integer) As IntPtr
End Function

<DllImport("user32.dll", EntryPoint:="GetWindowLongPtr")> _
Private Shared Function GetWindowLongPtr(ByVal hWnd As HandleRef, ByVal nIndex As Integer) As IntPtr
End Function

' This static method is required because Win32 does not support GetWindowLongPtr dirctly
Public Shared Function GetWindowLongPtr(ByVal hWnd As HandleRef, ByVal nIndex As Integer) As IntPtr
     If IntPtr.Size = 8 Then
      Return GetWindowLongPtr64(hWnd, nIndex)
     Else
      Return New IntPtr(GetWindowLong32(hWnd, nIndex)
     End If
End Function

You might want to declare the first parameter as HandleRef rather than IntPtr.

Sample Code:

C# Sample:

//Returns the ID for a window given the handle for that window as returned by EnumChildWindows.
//note that for this to work you will need to change the signature from 'int nIndex' to 'GWL nIndex' in all three places
private string GetID(IntPtr winhandle)
{
     IntPtr result;
     result = GetWindowLongPtr(winhandle, GWL.GWL_ID);
     return result.ToString();
}

Alternative Managed API:

Do you know one? Please contribute it!

Documentation