WinEvents 和 Active Accessibility
Microsoft Active Accessibility server 會引發 WinEvents,以在可存取的物件變更時通知用戶端。 伺服器會通知客戶端變更的情況很多。 Microsoft Active Accessibility 所定義的每個 事件常數 都會描述用戶端收到通知的條件。 例如,WinEvents 可以發出下列訊號:
- 建立或銷毀物件時。
- 當物件收到或失去焦點時。
- 物件的狀態或位置變更時。
- 物件的任何屬性變更時。
用戶端應用程式不會自動接收事件通知;他們必須藉由呼叫 setWinEventHook 函式來指定想要接收的事件。 使用 SetWinEventHook時,用戶端會註冊以接收一或多個事件,並設定攔截函式來處理指定的事件。 客戶可以使用相同的攔截函式來處理多種事件類型,也可以使用多個攔截函式。 用戶會針對需要註冊的每個攔截函式,呼叫 SetWinEventHook 一次。
Hook 函式位於客戶端的程式碼、映射到客戶端進程的 DLL,或映射到伺服器進程的 DLL 中。 每個方法都有優點和缺點。 如需詳細資訊,請參閱 In-Context 和上下文外掛鉤函式。
若要通知客戶端發生事件,伺服器會呼叫 NotifyWinEvent。 系統會檢查任何用戶端應用程式是否已設定事件的攔截函式,並視需要呼叫適當的攔截函式。
呼叫客戶端的攔截函式時,它會收到一些參數,描述事件和產生事件的物件。 若要存取產生事件的 物件,客戶端攔截函式會呼叫 AccessibleObjectFromEvent。
注意
如果沒有客戶端註冊接收 WinEvents,則呼叫 NotifyWinEvent 的伺服器效能影響微不足道。
伺服器只會呼叫 NotifyWinEvent,以取得自己的可存取物件中的變更;它們不會呼叫 notifyWinEvent ,以取得系統提供的使用者介面元素變更。
Event-Driven 通訊
客戶端必須先註冊 WinEvent 勾點,才能接收 WinEvent 通知。 為避免不必要的回呼並改善效能,建議用戶端只註冊他們需要接收的事件。
在攔截程式中,客戶端可以呼叫 AccessibleObjectFromEvent,以擷取事件所適用的元素的 IAccessible 物件。 透過這個物件,用戶端可以開始呼叫 IAccessible 方法來擷取資訊或與 UI 元素互動。