Защита от повторного входа в функциях-перехватчиках
В то время как функция-перехватчик обрабатывает событие, могут быть активированы дополнительные события, что может привести к повторному вхождать функцию перехватчика до завершения обработки исходного события. Проблема повторного входа в функции перехватчика заключается в том, что события завершаются вне последовательности, если только функция-перехватчик не обрабатывает эту ситуацию.
Например, рассмотрим случай, когда функция-перехватчик в программе чтения с экрана обрабатывает событие EVENT_OBJECT_VALUECHANGE для элемента управления редактированием. Если при обработке первого события изменения значения функция-перехватчик повторно вводится для обработки последующего события изменения значения, то второе событие завершается до первого события. Эта ситуация приводит к тому, что средство чтения с экрана передает пользователю неточные сведения.
Так как обработка событий прерывается, дополнительные события могут быть получены каждый раз, когда функция-перехватчик вызывает функцию, которая приводит к проверке очереди сообщений потока-получателя. Это происходит, когда в функции-перехватчике вызывается любое из следующих компонентов:
- Функция Windows SendMessage, GetMessage, PeekMessage, DialogBox или MessageBox
- Функции Microsoft Active Accessibility AccessibleObjectFromEvent, AccessibleObjectFromWindow, AccessibleObjectFromPoint
- Интерфейс IAccessible или другое свойство или метод модели COM, которые пересекают границы процесса
Поскольку функции-перехватчики вызывают свойства и методы AccessibleObjectFromEvent и IAccessible , предотвратить повторный вход невозможно. Единственное решение заключается в том, чтобы клиентские разработчики добавляли код в функцию перехватчика, которая обнаруживает повторный вход, и предпринимать соответствующие действия при повторном вводе функции-перехватчика.