Code:
                         / 4.0 / 4.0 / DEVDIV_TFS / Dev10 / Releases / RTMRel / wpf / src / UIAutomation / UIAutomationClient / MS / Internal / Automation / WindowInteractionStateTracker.cs / 1305600 / WindowInteractionStateTracker.cs
                        
                        
                            //---------------------------------------------------------------------------- 
//
// 
//    Copyright (C) Microsoft Corporation.  All rights reserved.
//   
//
// 
// Description: Class used to track new UI appearing and make sure any events 
// are propogated to that new UI.
// 
// History:
//  01/05/2005 : Created
//
//--------------------------------------------------------------------------- 
using System; 
using System.Globalization; 
using System.Text;
using System.Windows.Automation; 
using System.Diagnostics;
using MS.Win32;
namespace MS.Internal.Automation 
{
    // Class used to track new UI appearing and make sure any events 
    // are propogated to that new UI. 
    internal class WindowInteractionStateTracker : WinEventWrap
    { 
        //-----------------------------------------------------
        //
        //  Constructors
        // 
        //-----------------------------------------------------
 
        #region Constructors 
        internal WindowInteractionStateTracker() 
            : base(new int[] { NativeMethods.EVENT_OBJECT_STATECHANGE })
        {
            // Intentionally not setting the callback for the base WinEventWrap since the WinEventProc override
            // in this class calls RaiseEventInThisClientOnly to actually raise the event to the client. 
        }
 
        #endregion Constructors 
 
        //------------------------------------------------------
        //
        //  Internal Methods
        // 
        //-----------------------------------------------------
 
        #region Internal Methods 
        internal override void WinEventProc(int eventId, IntPtr hwnd, int idObject, int idChild, uint eventTime) 
        {
            // ignore any event not pertaining directly to the window
            if (idObject != UnsafeNativeMethods.OBJID_WINDOW)
            { 
                return;
            } 
 
            // Ignore if this is a bogus hwnd (shouldn't happen)
            if (hwnd == IntPtr.Zero) 
            {
                return;
            }
 
            OnStateChange(hwnd, idObject, idChild);
        } 
 
        #endregion Internal Methods
 
        //------------------------------------------------------
        //
        //  Private Methods 
        //
        //------------------------------------------------------ 
 
        #region Private Methods
 
        private void OnStateChange(IntPtr hwnd, int idObject, int idChild)
        {
            NativeMethods.HWND nativeHwnd = NativeMethods.HWND.Cast(hwnd);
 
            // Ignore windows that have been destroyed
            if (!SafeNativeMethods.IsWindow(nativeHwnd)) 
            { 
                return;
            } 
            AutomationElement rawEl = AutomationElement.FromHandle(hwnd);
            try 
            {
                rawEl.GetCurrentPattern(WindowPattern.Pattern); 
            } 
            catch (InvalidOperationException)
            { 
                // Only raise this event for elements with the WindowPattern.
                return;
            }
 
            Object windowInteractionState = rawEl.GetPatternPropertyValue(WindowPattern.WindowInteractionStateProperty, false);
 
            // if has no state value just return 
            if (!(windowInteractionState is WindowInteractionState))
            { 
                return;
            }
            WindowInteractionState state = (WindowInteractionState)windowInteractionState; 
            // Filter... avoid duplicate events 
            if (hwnd == _lastHwnd && state == _lastState) 
            {
                return; 
            }
            AutomationPropertyChangedEventArgs e = new AutomationPropertyChangedEventArgs(
                                        WindowPattern.WindowInteractionStateProperty, 
                                        hwnd == _lastHwnd ? _lastState : WindowInteractionState.Running,
                                        state); 
 
            ClientEventManager.RaiseEventInThisClientOnly(AutomationElement.AutomationPropertyChangedEvent, rawEl, e);
 
            // save the last hwnd/rect for filtering out duplicates
            _lastHwnd = hwnd;
            _lastState = state;
        } 
        #endregion Private Methods 
 
        //----------------------------------------------------- 
        //
        //  Private Fields
        //
        //------------------------------------------------------ 
        #region Private Fields 
 
        private WindowInteractionState _lastState;      // keep track of last interaction state
        private IntPtr _lastHwnd;                       // and hwnd for dup checking 
        #endregion Private Fields
    }
} 
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
// Copyright (c) Microsoft Corporation. All rights reserved.
//---------------------------------------------------------------------------- 
//
// 
//    Copyright (C) Microsoft Corporation.  All rights reserved.
//   
//
// 
// Description: Class used to track new UI appearing and make sure any events 
// are propogated to that new UI.
// 
// History:
//  01/05/2005 : Created
//
//--------------------------------------------------------------------------- 
using System; 
using System.Globalization; 
using System.Text;
using System.Windows.Automation; 
using System.Diagnostics;
using MS.Win32;
namespace MS.Internal.Automation 
{
    // Class used to track new UI appearing and make sure any events 
    // are propogated to that new UI. 
    internal class WindowInteractionStateTracker : WinEventWrap
    { 
        //-----------------------------------------------------
        //
        //  Constructors
        // 
        //-----------------------------------------------------
 
        #region Constructors 
        internal WindowInteractionStateTracker() 
            : base(new int[] { NativeMethods.EVENT_OBJECT_STATECHANGE })
        {
            // Intentionally not setting the callback for the base WinEventWrap since the WinEventProc override
            // in this class calls RaiseEventInThisClientOnly to actually raise the event to the client. 
        }
 
        #endregion Constructors 
 
        //------------------------------------------------------
        //
        //  Internal Methods
        // 
        //-----------------------------------------------------
 
        #region Internal Methods 
        internal override void WinEventProc(int eventId, IntPtr hwnd, int idObject, int idChild, uint eventTime) 
        {
            // ignore any event not pertaining directly to the window
            if (idObject != UnsafeNativeMethods.OBJID_WINDOW)
            { 
                return;
            } 
 
            // Ignore if this is a bogus hwnd (shouldn't happen)
            if (hwnd == IntPtr.Zero) 
            {
                return;
            }
 
            OnStateChange(hwnd, idObject, idChild);
        } 
 
        #endregion Internal Methods
 
        //------------------------------------------------------
        //
        //  Private Methods 
        //
        //------------------------------------------------------ 
 
        #region Private Methods
 
        private void OnStateChange(IntPtr hwnd, int idObject, int idChild)
        {
            NativeMethods.HWND nativeHwnd = NativeMethods.HWND.Cast(hwnd);
 
            // Ignore windows that have been destroyed
            if (!SafeNativeMethods.IsWindow(nativeHwnd)) 
            { 
                return;
            } 
            AutomationElement rawEl = AutomationElement.FromHandle(hwnd);
            try 
            {
                rawEl.GetCurrentPattern(WindowPattern.Pattern); 
            } 
            catch (InvalidOperationException)
            { 
                // Only raise this event for elements with the WindowPattern.
                return;
            }
 
            Object windowInteractionState = rawEl.GetPatternPropertyValue(WindowPattern.WindowInteractionStateProperty, false);
 
            // if has no state value just return 
            if (!(windowInteractionState is WindowInteractionState))
            { 
                return;
            }
            WindowInteractionState state = (WindowInteractionState)windowInteractionState; 
            // Filter... avoid duplicate events 
            if (hwnd == _lastHwnd && state == _lastState) 
            {
                return; 
            }
            AutomationPropertyChangedEventArgs e = new AutomationPropertyChangedEventArgs(
                                        WindowPattern.WindowInteractionStateProperty, 
                                        hwnd == _lastHwnd ? _lastState : WindowInteractionState.Running,
                                        state); 
 
            ClientEventManager.RaiseEventInThisClientOnly(AutomationElement.AutomationPropertyChangedEvent, rawEl, e);
 
            // save the last hwnd/rect for filtering out duplicates
            _lastHwnd = hwnd;
            _lastState = state;
        } 
        #endregion Private Methods 
 
        //----------------------------------------------------- 
        //
        //  Private Fields
        //
        //------------------------------------------------------ 
        #region Private Fields 
 
        private WindowInteractionState _lastState;      // keep track of last interaction state
        private IntPtr _lastHwnd;                       // and hwnd for dup checking 
        #endregion Private Fields
    }
} 
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
// Copyright (c) Microsoft Corporation. All rights reserved.
                        
                        
                        
                        
                    Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- GetCertificateRequest.cs
 - RegexGroupCollection.cs
 - datacache.cs
 - RubberbandSelector.cs
 - PassportIdentity.cs
 - BufferModesCollection.cs
 - FontStyleConverter.cs
 - LineInfo.cs
 - TreeView.cs
 - SubtreeProcessor.cs
 - PointLightBase.cs
 - MobileResource.cs
 - ElementMarkupObject.cs
 - TdsParserStateObject.cs
 - ExceptionRoutedEventArgs.cs
 - ValidatorAttribute.cs
 - TileBrush.cs
 - HeaderedContentControl.cs
 - StatusBarItem.cs
 - CallContext.cs
 - RelationalExpressions.cs
 - Timer.cs
 - SystemParameters.cs
 - AbstractDataSvcMapFileLoader.cs
 - NullableDecimalMinMaxAggregationOperator.cs
 - XmlSchemaSimpleTypeList.cs
 - Properties.cs
 - MessageDispatch.cs
 - TreeNodeCollectionEditor.cs
 - SessionStateUtil.cs
 - SamlConstants.cs
 - EncryptedType.cs
 - XhtmlBasicLinkAdapter.cs
 - ScaleTransform3D.cs
 - ProxyAttribute.cs
 - TrustExchangeException.cs
 - BuildResultCache.cs
 - SvcMapFileSerializer.cs
 - ZipIOCentralDirectoryFileHeader.cs
 - TrackingRecord.cs
 - _ListenerAsyncResult.cs
 - ArrangedElement.cs
 - _NTAuthentication.cs
 - LicenseManager.cs
 - CqlBlock.cs
 - DescendentsWalkerBase.cs
 - ListChunk.cs
 - SupportingTokenDuplexChannel.cs
 - HierarchicalDataSourceControl.cs
 - ParenthesizePropertyNameAttribute.cs
 - FactoryMaker.cs
 - AssertValidation.cs
 - CurrentChangingEventArgs.cs
 - MaskInputRejectedEventArgs.cs
 - SignatureHelper.cs
 - Quaternion.cs
 - InfoCardSymmetricAlgorithm.cs
 - ValidatingReaderNodeData.cs
 - MulticastIPAddressInformationCollection.cs
 - Context.cs
 - AuthenticationSection.cs
 - DataKeyCollection.cs
 - ComponentDispatcherThread.cs
 - PolicyValidator.cs
 - RadialGradientBrush.cs
 - _NegoStream.cs
 - DefaultValueConverter.cs
 - ExpandCollapseProviderWrapper.cs
 - ReadOnlyDictionary.cs
 - StylusOverProperty.cs
 - BrushValueSerializer.cs
 - XmlWrappingWriter.cs
 - SctClaimSerializer.cs
 - FormViewCommandEventArgs.cs
 - RoutedEventValueSerializer.cs
 - VisualTreeUtils.cs
 - XamlBuildTaskServices.cs
 - InvalidCommandTreeException.cs
 - MD5CryptoServiceProvider.cs
 - WebPartVerbsEventArgs.cs
 - GradientStop.cs
 - CodePageUtils.cs
 - DesignerUtility.cs
 - BitmapCodecInfo.cs
 - FieldToken.cs
 - _TimerThread.cs
 - formatstringdialog.cs
 - DataGridViewRow.cs
 - XmlDocument.cs
 - TypeDescriptor.cs
 - SiteMapPathDesigner.cs
 - SubqueryRules.cs
 - VariableModifiersHelper.cs
 - NestedContainer.cs
 - XmlBinaryReaderSession.cs
 - DocumentSequenceHighlightLayer.cs
 - NativeMethods.cs
 - ContextMenuStripGroupCollection.cs
 - EventLogger.cs
 - DeflateEmulationStream.cs