예제 #1
0
        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;
        }
예제 #2
0
        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;
        }