防止攔截函式中的重新進入
當攔截函式處理事件時,可能會觸發其他事件,這可能會導致攔截函式在原始事件的處理完成之前重新輸入。 攔截函式中重新進入的問題在於除非攔截函式處理這種情況,否則事件會依序完成。
例如,假設螢幕助讀程式中的攔截函式正在處理編輯控制項 的EVENT_OBJECT_VALUECHANGE 事件。 如果在處理第一個值變更事件時,攔截函式會重新輸入來處理後續的值變更事件,則會在第一個事件之前完成第二個事件。 這種情況會導致螢幕助讀程式向使用者傳達不正確的資訊。
因為事件處理會中斷,所以每當攔截函式呼叫會導致擁有線程訊息佇列被檢查的函式時,可能會收到其他事件。 當攔截函式內呼叫下列任一項時,就會發生這種情況:
- Windows SendMessage、 GetMessage、 PeekMessage、 DialogBox或 MessageBox 函式
- Microsoft Active Accessibility 函式 AccessibleObjectFromEvent、 AccessibleObjectFromWindow、AccessibleObjectFromPoint
- IAccessible介面或其他元件物件模型 (COM) 屬性或跨進程界限的方法
由於勾點函式會呼叫 AccessibleObjectFromEvent 和 IAccessible 屬性和方法,因此無法防止重新進入。 唯一的解決方案是讓用戶端開發人員在攔截函式中新增程式碼,以偵測重新進入,並在重新進入攔截函式時採取適當的動作。