GetScrollInfo (user32)
Last changed: -178.133.96.150

.
Summary

C# Signature:

[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool GetScrollInfo(IntPtr hwnd, int fnBar, ref SCROLLINFO lpsi);

VB.Net Signature:

<DllImport("user32.dll", SetLastError:=True)> _
Public Function GetScrollInfo(hWnd As IntPtr, _
        <MarshalAs(UnmanagedType.I4)>fnBar As SBOrientation, _
        <MarshalAs(UnmanagedType.Struct)>ByRef lpsi As SCROLLINFO) As Integer
End Function

VB Signature:

Declare Function GetScrollInfo Lib "user32" (ByVal hWnd As IntPtr, ByVal fnBar As ScrollBarDirection, ByRef lpsi As SCROLLINFO) As Integer

C# User-Defined Types:

SCROLLINFO, SBOrientation, ScrollInfoMask

Notes:

None.

Tips & Tricks:

Please add some!

C# Sample Code:

// Returns the width of a UserControl containing a RichTextBox
//  such that no horizontal scrollbar will be needed

public enum ScrollInfoMask : uint
{
     SIF_RANGE = 0x1,
     SIF_PAGE = 0x2,
     SIF_POS = 0x4,
     SIF_DISABLENOSCROLL = 0x8,
     SIF_TRACKPOS = 0x10,
     SIF_ALL = (SIF_RANGE | SIF_PAGE | SIF_POS | SIF_TRACKPOS),
  }
public enum SBOrientation : int
{
     SB_HORZ = 0x0,
     SB_VERT = 0x1,
     SB_CTL = 0x2,
     SB_BOTH = 0x3
  }
[Serializable, StructLayout(LayoutKind.Sequential)]
struct SCROLLINFO
{
     public int cbSize; // (uint) int is because of Marshal.SizeOf
     public uint fMask;
     public int nMin;
     public int nMax;
     public uint nPage;
     public int nPos;
     public int nTrackPos;
}

public int PreferredWidth
{
    get
    {
      int MINWIDTH = 200;
      int BORDERWIDTH = SystemInformation.Border3DSize.Width;
      int SCROLLBARWIDTH = SystemInformation.VerticalScrollBarWidth;

      SCROLLINFO si = new SCROLLINFO();
      si.cbSize = Marshal.SizeOf( si );
      si.fMask = (int) ScrollInfoMask.SIF_RANGE;
      GetScrollInfo(RichTextBox1.Handle, (int) SBOrientation.SB_HORZ, ref si);

      int iWidth = si.nMax - si.nMin + 2 * BORDERWIDTH + SCROLLBARWIDTH + 2;    
      return Math.Max( MINWIDTH, iWidth );
    }
}

VB Sample Code:

    Private Function GetScrollBarPageSize(ByVal hWnd As IntPtr, ByVal fnBar As Integer) As Integer
    Dim si As New SCROLLINFO
    With si
        .cbSize = Len(si)
        .fMask = ScrollInfoMask.SIF_PAGE
    End With
    Dim lRet As Integer = GetScrollInfo(hWnd, fnBar, si)
    If lRet <> 0 Then
        Return si.nPage
    Else
        Return -1
    End If
    End Function

Alternative Managed API:

Do you know one? Please contribute it!

Documentation
SeeAlso