// AddWinEventListener - add an event callback for a global listener private static void AddWinEventListener(Tracker idx, WinEventWrap eventWrapper) { // make sure we can queue items CheckStartCallbackQueueing(); _winEventTrackers[(int)idx] = eventWrapper; _callbackQueue.PostSyncWorkItem(new WinEventQueueItem(eventWrapper, WinEventQueueItem.StartListening)); }
// StopWinEventTracking is called when we just want to quit (RemoveAllListeners) private static void StopWinEventTracking() { int i; for (i = 0; i < (int)Tracker.NumEventTrackers; i++) { WinEventWrap eventWrapper = _winEventTrackers[i]; if (eventWrapper != null) { eventWrapper.StopListening(); _winEventTrackers[i] = null; } } }
// RemoveWinEventListener - remove an event callback for a global listener private static void RemoveWinEventListener(Tracker idx, Delegate eventCallback) { WinEventWrap eventWrapper = _winEventTrackers[(int)idx]; if (eventWrapper == null) { return; } bool fRemovedLastListener = eventWrapper.RemoveCallback(eventCallback); if (fRemovedLastListener) { _callbackQueue.PostSyncWorkItem(new WinEventQueueItem(eventWrapper, WinEventQueueItem.StopListening)); _winEventTrackers[(int)idx] = null; CheckStopCallbackQueueing(); } }
// AddRootListener - Add a listener for an event whose reference is always the // root and scope is all elements private static void AddRootListener(Tracker idx, Delegate eventCallback, EventListener l) { lock ( _classLock ) { // Add this listener to client-side store of listeners and give the server // a chance to enable accessibility for this event AddListener(AutomationElement.RootElement, eventCallback, l); // Track WinEvents WinEventWrap eventWrapper = _winEventTrackers[(int)idx]; if (eventWrapper == null) { // First time create a WinEvent tracker and start listening AddWinEventListener(idx, GetNewRootTracker(idx)); } else { // Subsequent times just add the callback to the existing WinEvent eventWrapper.AddCallback(eventCallback); } } }
//------------------------------------------------------ // // Constructors // //------------------------------------------------------ #region Constructors internal WinEventQueueItem(WinEventWrap winEventWrap, int state) { _winEventWrap = winEventWrap; _state = state; }