Поделиться через


Защита от повторного входа в функциях-перехватчиках

В то время как функция-перехватчик обрабатывает событие, могут быть активированы дополнительные события, что может привести к повторному вхождать функцию перехватчика до завершения обработки исходного события. Проблема повторного входа в функции перехватчика заключается в том, что события завершаются вне последовательности, если только функция-перехватчик не обрабатывает эту ситуацию.

Например, рассмотрим случай, когда функция-перехватчик в программе чтения с экрана обрабатывает событие EVENT_OBJECT_VALUECHANGE для элемента управления редактированием. Если при обработке первого события изменения значения функция-перехватчик повторно вводится для обработки последующего события изменения значения, то второе событие завершается до первого события. Эта ситуация приводит к тому, что средство чтения с экрана передает пользователю неточные сведения.

Так как обработка событий прерывается, дополнительные события могут быть получены каждый раз, когда функция-перехватчик вызывает функцию, которая приводит к проверке очереди сообщений потока-получателя. Это происходит, когда в функции-перехватчике вызывается любое из следующих компонентов:

Поскольку функции-перехватчики вызывают свойства и методы AccessibleObjectFromEvent и IAccessible , предотвратить повторный вход невозможно. Единственное решение заключается в том, чтобы клиентские разработчики добавляли код в функцию перехватчика, которая обнаруживает повторный вход, и предпринимать соответствующие действия при повторном вводе функции-перехватчика.