Попытайтесь блокировать перед дампом. Вот то, как я инициирую полный дамп приложения. Мог бы работать на Вас, не мог бы.
Context.Application.Lock();
Context.Session.Abandon();
Context.Application.RemoveAll();
Context.Application.Restart();
Context.Application.UnLock();
Ну, это некрасиво, но у меня это работает. Обычно я проверяю точку внутри верхнего левого угла richtextbox и точку внутри нижнего левого угла текстового поля. Возможно, вам придется настроить координаты точки в зависимости от того, как отображается ваше Richtextbox. Затем я получаю индекс символа, ближайший к каждой из этих двух точек, и извлекаю строку, в которой он находится.
Dim topIndex As Integer = RichTextBox1.GetCharIndexFromPosition(New Point(1, 1))
Dim bottomIndex As Integer = RichTextBox1.GetCharIndexFromPosition(New Point(1, RichTextBox1.Height - 1))
Dim topLine As Integer = RichTextBox1.GetLineFromCharIndex(topIndex)
Dim bottomLine As Integer = RichTextBox1.GetLineFromCharIndex(bottomIndex)
Dim numLinesDisplayed As Integer = bottomLine - topLine
Я тестировал его для форматированных текстовых полей с отображаемыми шрифтами разных размеров, и, похоже, он работает. Я подозреваю, что возвращаемый ответ будет отклонен (слишком мал) на одну строку, если под последней строкой отображаемого текста много белого пространства, а следующая строка почти готова к отображению. Если у вас очень высокое Richtextbox с большим количеством строк, это не должно быть проблемой.