private void HandleBoundingRectChange(IntPtr hwnd) { NativeMethods.HWND nativeHwnd = NativeMethods.HWND.Cast(hwnd); NativeMethods.RECT rc32 = new NativeMethods.RECT(0, 0, 0, 0); // if GetWindwRect fails, most likely the nativeHwnd is an invalid window, so just return. if (!Misc.GetWindowRect(nativeHwnd, out rc32)) { return; } // Filter... avoid duplicate events if (hwnd == _lastHwnd && Compare(rc32, _lastRect)) { return; } AutomationElement rawEl = AutomationElement.FromHandle(hwnd); // Problem with Avalon combo box & menus: // There was a windows issue where we get two events. One for the hwnd (LocationChange WinEvent) // and one for the [usually] DockPanel (Avalon BoundingRectangleProperty change). Both have the // same Rect value. It's unclear is this issue is still occuring and what (if anything) needs to be done. // Waiting for WPP redesign to investigate further how to filter out the duplicate which // happens to be the first (hwnd-based) event. // AutomationPropertyChangedEventArgs e = new AutomationPropertyChangedEventArgs( AutomationElement.BoundingRectangleProperty, Rect.Empty, new Rect(rc32.left, rc32.top, rc32.right - rc32.left, rc32.bottom - rc32.top)); // In the case of HWND hosted Avalon content, we will get a LocationChange WinEvent for the host // window when it's bounding rect changes (e.g. an Avalon window is resized) and we won't (that I've seen) // get a BoundingRect property change from the Avalon content. Therefore, we need to map the WinEvent. // In this case, rawEl is already the remote object. It's ol to call this locally since this is called // to handle a WinEvent (e.g. always called on client-side). Since rawEl may be local (proxied) or // remote (native) impl then use that version of RaiseEventInThisClientOnly ClientEventManager.RaiseEventInThisClientOnly(AutomationElement.AutomationPropertyChangedEvent, rawEl, e); // save the last hwnd/rect for filtering out duplicates _lastHwnd = hwnd; _lastRect = rc32; }
private void HandleBoundingRectChange(IntPtr hwnd) { NativeMethods.HWND nativeHwnd = NativeMethods.HWND.Cast(hwnd); NativeMethods.RECT rc32 = new NativeMethods.RECT(0, 0, 0, 0); // if GetWindwRect fails, most likely the nativeHwnd is an invalid window, so just return. if (!Misc.GetWindowRect(nativeHwnd, out rc32)) { return; } // Filter... avoid duplicate events if (hwnd == _lastHwnd && Compare(rc32, _lastRect)) { return; } AutomationElement rawEl = AutomationElement.FromHandle(hwnd); // // AutomationPropertyChangedEventArgs e = new AutomationPropertyChangedEventArgs( AutomationElement.BoundingRectangleProperty, Rect.Empty, new Rect(rc32.left, rc32.top, rc32.right - rc32.left, rc32.bottom - rc32.top)); // ClientEventManager.RaiseEventInThisClientOnly(AutomationElement.AutomationPropertyChangedEvent, rawEl, e); // save the last hwnd/rect for filtering out duplicates _lastHwnd = hwnd; _lastRect = rc32; }