Вам не нужно обновлять RTB для каждого нажатия клавиши, что происходит, когда вы обрабатываете TextChanged без какого-либо вызова Application.DoEvents ().
Я обнаружил, что лучший способ получить приемлемую производительность - это обработать событие KeyDown. Если код клавиши (с модификатором) является печатным символом, я запускаю таймер, чей обработчик события Tick проверяет текст richtextbox после, скажем, 100 мс.
Поскольку при возникновении события KeyDown типизированный символ не печатается, вы можете изменить цвет текста для этого символа в этом обработчике событий, установив свойство SelectionColor (без изменения выделения в коде), поэтому не нужно замораживать контроль. Не пытайтесь делать в этом слишком много ресурсов процессора, поскольку у вас возникнут проблемы с отзывчивостью.
Наконец, изменение поведения RichTextBox - это сприал, как только вы отклонитесь от нормы, вы начнете использовать собственный код для всех видов задач (таких как копирование / вставка, отмена / повтор и прокрутка), которые обычно выполняются с использованием контролирует собственные функции. После этого вы решаете, продолжать ли вам самим или выбрать стороннего редактора. Также обратите внимание, что, хотя вы уже начали использовать Windows API, этого будет гораздо больше, в частности для прокрутки, печати и рисования событий, хотя есть хорошие онлайн-ресурсы, документирующие их.
Не позволяйте этому обескураживать вас, просто знайте, что ждет вас в будущем, если требования к вашему приложению возрастут.