SetWindowLong (user32)
Last changed: randomdude12-104.245.251.252

.
Summary
The SetWindowLongPtr API. Use this one instead of SetWindowLong to assure 64 bit compatibility.

C# Signature:

// This helper static method is required because the 32-bit version of user32.dll does not contain this API
// (on any versions of Windows), so linking the method will fail at run-time. The bridge dispatches the request
// to the correct function (GetWindowLong in 32-bit mode and GetWindowLongPtr in 64-bit mode)
public static IntPtr SetWindowLongPtr(HandleRef hWnd, int nIndex, IntPtr dwNewLong)
{
      if (IntPtr.Size == 8)
      return SetWindowLongPtr64(hWnd, nIndex, dwNewLong);
      else
      return new IntPtr(SetWindowLong32(hWnd, nIndex, dwNewLong.ToInt32()));
}

[DllImport("user32.dll", EntryPoint="SetWindowLong")]
private static extern int SetWindowLong32(HandleRef hWnd, int nIndex, int dwNewLong);

[DllImport("user32.dll", EntryPoint="SetWindowLongPtr")]
private static extern IntPtr SetWindowLongPtr64(HandleRef hWnd, int nIndex, IntPtr dwNewLong);
//
If that doesn't work, the following signature can be used alternatively.
//
[DllImport("user32.dll")]
static extern int SetWindowLong(IntPtr hWnd, int nIndex, uint dwNewLong);

VB.NET Signature:

  <System.Runtime.InteropServices.DllImport("user32.dll", EntryPoint:="SetWindowLong")> _
  Private Shared Function SetWindowLong32(ByVal hWnd As IntPtr, <MarshalAs(UnmanagedType.I4)>nIndex As WindowLongFlags, ByVal dwNewLong As Integer) As Integer
  End Function

  <System.Runtime.InteropServices.DllImport("user32.dll", EntryPoint:="SetWindowLongPtr")> _
  Private Shared Function SetWindowLongPtr64(ByVal hWnd As IntPtr, <MarshalAs(UnmanagedType.I4)>nIndex As WindowLongFlags, ByVal dwNewLong As IntPtr) As IntPtr
  End Function

  Public Shared Function SetWindowLongPtr(ByVal hWnd As IntPtr, nIndex As WindowLongFlags, ByVal dwNewLong As IntPtr) As IntPtr
    If IntPtr.Size = 8 Then
      Return SetWindowLongPtr64(hWnd, nIndex, dwNewLong)
    Else
      Return New IntPtr(SetWindowLong32(hWnd, nIndex, dwNewLong.ToInt32))
    End If
  End Function

VB.NET Signature:

Public Declare Function SetWindowLongPtr Lib "user32" Alias "SetWindowLongPtrA" _
        (ByVal hWnd As Long, _
         ByVal nIndex As WindowLongFlags, _
         ByVal dwNewLong As Long) As Long

User-Defined Types:

WindowLongFlags

Alternative Managed API:

Do you know one? Please contribute it!

Notes:

The constants required to call this can be found in the constant section of this site.

Tips & Tricks:

You can show and hide the window from the taskbar. Use the GWL_EXSTYLE, WS_EX_APPWINDOW and WS_EX_NOACTIVATE constants to achieve this.

Constant Values:

    GWL_EXSTYLE needs a value of -0x14.
    WS_EX_NOACTIVATE needs a value of 0x08000000.
    WS_EX_APPWINDOW needs a value of 0x40000.

To show a winow, use the following call:

    SetWindowLong(GetPinvokeHandle(), GWL_EXSTYLE, WS_EX_APPWINDOW);

To hide a window, use the following call:

    SetWindowLong(GetPinvokeHandle(), GWL_EXSTYLE, WS_EX_NOACTIVATE);

Sample Code:

Please add some!

Documentation

Error in Windows 7 64 bit under Parallels on Mac, in Visual Studio Express 13 (Visual Basic Forms Application):

When called, the following error was given:

Additional information: Unable to find an entry point named 'SetWindowLongPtrA' in DLL 'user32'

...Geoff Kelly