[DllImport( "user32.dll", SetLastError=true, EntryPoint="GetScrollBarInfo")]
private static extern int GetScrollBarInfo(IntPtr hWnd, uint idObject, ref SCROLLBARINFO psbi);
[StructLayout(LayoutKind.Sequential)]
public struct SCROLLBARINFO
{
public int cbSize;
public Rectangle rcScrollBar;
public int dxyLineButton;
public int xyThumbTop;
public int xyThumbBottom;
public int reserved;
[MarshalAs(UnmanagedType.ByValArray, SizeConst=6)]
public int[] rgstate;
}
This didn't work for me with the Rectangle type for SCROLLBARINFO.rcScrollBar. To rectify this I altered this declaration to type RECT using the following standard definition.
public struct RECT
{
public int left;
public int top;
public int right;
public int bottom;
}
This then worked for me!
for idObject, use one of these values (see the MSDN link at the bottom for their usage):
private const uint OBJID_HSCROLL = 0xFFFFFFFA;
private const uint OBJID_VSCROLL = 0xFFFFFFFB;
private const uint OBJID_CLIENT = 0xFFFFFFFC;
SCROLLBARINFO psbi = new SCROLLBARINFO();
psbi.cbSize = Marshal.SizeOf(psbi);
int nResult = GetScrollBarInfo(this.Handle, OBJID_CLIENT, ref psbi); // "this" is a scrollbar
if (nResult == 0)
{
int nLatError = GetLastError(); // in kernel32.dll
}
probably Marshal.GetLastWin32Error() is better here
if you have a reference to a System.Windows.Forms.ScrollBar, use it's properties. otherwise,
SystemInformation.HorizontalScrollbar*
and
SystemInformation.VerticalScrollbar*
can give you some of the data.