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