If you have RichTextBox scrollbars turned off (set to None) and are using a SendMessage() call from C# to user32.dll to scroll it, you don't get SCROLLINFO while the scrollbars are turned off. That means you have to keep a line counter and use SB_LINEUP and SB_LINEDOWN in the low 16 bits of Lparam as usual, but since the position you would place in the high 16 bits would ordinarily come from reading a SCROLLINFO using GetScrollInfo() and you don't have that to use even if you'd want to send SB_THUMBTRACK or SB_THUMBPOSITION, I don't think a zero for this value is out of place.
You can still manage OK with a line counter and just calling a scroll routine to LINEUP or LINEDOWN; and if you need to scroll a distance you can set richTextBox.Visible=false beforehand. The text region will flash, but it still isn't too bad if you're jumping a distance of, say 2500 lines; and you can always sample the background color of an .rtf file being displayed and set the background color of the panel the RichTextBox is on to that color. All in all, although there isn't really any direct way to programmatically scroll one of these things, it can be done fairly consistently even with single-line scrolling.
But what happens when you have, say, a bitmap image embedded in the .rtf at the beginning of the file? If your line counter happens to fall in the range between 0 and M-1, where M is the number of lines occupied by the image, you might scroll up until your line counter says M-4 but the richTextBox may very well place you AFTER the image end at line M. So how do you scroll to a position somewhere within the bitmap image?
The fact is, I don't think you do. But it's curious to wonder who, out there somewhere, would have run across a solution for that.
I figure out of desperation you can always use SB_TOP with your WM_SCROLL message and just set the display to top-of-file. Any more sophisticated notions, anyone?