Задача: необходимо контролировать количество символов в тексте документа, а в случае превышения некоторого максимального значения выделять цветом "лишние" символы. Собственно сама проверка и выделение цветом проблем не вызывают. Главный вопрос, каким образом оперативно отслеживать изменения в документе и вызывать проверку.
Вариант 1. Запускать проверку периодически через некоторые интервалы времени. Недостатки: бесконечный цикл с проверкой условия даже при отсутствии изменений в документе.
Вариант 2. Отслеживать события нажатия клавиш (набор и удаление символов) и левой кнопки мыши (вставка текста посредством контекстного меню или кнопки на панели инструментов).
Sub HandleEvents()
Dim m As MSG
bCancel = False
Do While Not bCancel
WaitMessage
If PeekMessage(m, GetActiveWindow, 0, 0, PM_NOREMOVE) Then
Select Case m.Message
Case WM_KEYUP, WM_LBUTTONUP
UpdateInfo
End Select
End If
DoEvents
Loop
End Sub
Sub AutoOpen()
HandleEvents
End Sub
Недостатки варианта 2: 1) некоторые изменения становятся видны только после дополнительного клика мышью или нажатия клавиши; 2) при открытии документа в Word 2003 SP3 иконки стандартных панелей инструментов не видны до первого клика (см. приложенный скриншот).
Может, есть решение лучше? Подходящих событий объектной модели Word я не нашел.
Событие
WindowSelectionChange не подходит, так как не происходит:
1) при наборе текста с клавиатуры, хотя курсор перемещается вправо;
2) при удалении символов клавишей
BackSpace.