using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Runtime.InteropServices; namespace CPlus_GW { class Scroll { [DllImport("user32.dll")] [return: MarshalAs(UnmanagedType.Bool)] static extern bool GetScrollInfo(IntPtr hwnd, int fnBar, ref SCROLLINFO lpsi); [DllImport("user32.dll")] static extern int SetScrollInfo(IntPtr hwnd, int fnBar, [In] ref SCROLLINFO lpsi, bool fRedraw); [DllImport("User32.dll", CharSet = CharSet.Auto, EntryPoint = "SendMessage")] static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam); struct SCROLLINFO { public uint cbSize; public uint fMask; public int nMin; public int nMax; public uint nPage; public int nPos; public int nTrackPos; } enum ScrollBarDirection { SB_HORZ = 0, SB_VERT = 1, SB_CTL = 2, SB_BOTH = 3 } enum ScrollInfoMask { 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 } const int WM_VSCROLL = 277; const int SB_LINEUP = 0; const int SB_LINEDOWN = 1; const int SB_THUMBPOSITION = 4; const int SB_THUMBTRACK = 5; const int SB_TOP = 6; const int SB_BOTTOM = 7; const int SB_ENDSCROLL = 8; // Scrolls a given textbox. handle: an handle to our textbox. pixels: number of pixels to scroll. /// /// scrols /// /// rich text box handle /// public static void scroll(IntPtr handle, int pixels) { IntPtr ptrLparam = new IntPtr(0); IntPtr ptrWparam; // Get current scroller posion SCROLLINFO si = new SCROLLINFO(); si.cbSize = (uint)Marshal.SizeOf(si); si.fMask = (uint)ScrollInfoMask.SIF_ALL; GetScrollInfo(handle, (int)ScrollBarDirection.SB_VERT, ref si); // Increase posion by pixles if (si.nPos < (si.nMax - si.nPage)) si.nPos += pixels; else { ptrWparam = new IntPtr(SB_ENDSCROLL); SendMessage(handle, WM_VSCROLL, ptrWparam, ptrLparam); } // Reposition scroller SetScrollInfo(handle, (int)ScrollBarDirection.SB_VERT, ref si, true); // Send a WM_VSCROLL scroll message using SB_THUMBTRACK as wParam // SB_THUMBTRACK: low-order word of wParam, si.nPos high-order word of wParam ptrWparam = new IntPtr(SB_THUMBTRACK + 0x10000 * si.nPos); SendMessage(handle, WM_VSCROLL, ptrWparam, ptrLparam); } } }