Code:
/ Dotnetfx_Vista_SP2 / Dotnetfx_Vista_SP2 / 8.0.50727.4016 / DEVDIV / depot / DevDiv / releases / Orcas / QFE / wpf / src / Base / System / Windows / Interop / ComponentDispatcher.cs / 1 / ComponentDispatcher.cs
//------------------------------------------------------------------------------ //// Copyright (c) Microsoft Corporation. All rights reserved. // //----------------------------------------------------------------------------- using System; using System.Threading; using System.Diagnostics.CodeAnalysis; using System.Security; using System.Security.Permissions; using MS.Internal; using MS.Win32; using MS.Internal.WindowsBase; namespace System.Windows.Interop { ////// This is the delegate used for registering with the /// ThreadFilterMessage and ThreadPreprocessMessage Events. /// [SuppressMessage("Microsoft.Design", "CA1045:DoNotPassTypesByReference")] public delegate void ThreadMessageEventHandler(ref MSG msg, ref bool handled); ////// This is a static class used to share control of the message pump. /// Whomever is pumping (i.e. calling GetMessage()) will also send /// the messages to RaiseThreadKeyMessage() which will dispatch them to /// the ThreadFilterMessage and then (if not handled) to the ThreadPreprocessMessage /// delegates. That way everyone can be included in the message loop. /// Currently only Keyboard messages are supported. /// There are also Events for Idle and facilities for Thread-Modal operation. /// public static class ComponentDispatcher { static ComponentDispatcher() { _threadSlot = Thread.AllocateDataSlot(); } private static ComponentDispatcherThread CurrentThreadData { get { ComponentDispatcherThread data; object obj = Thread.GetData(_threadSlot); if(null == obj) { data = new ComponentDispatcherThread(); Thread.SetData(_threadSlot, data); } else { data = (ComponentDispatcherThread) obj; } return data; } } // Properties ////// Returns true if one or more components has gone modal. /// Although once one component is modal a 2nd shouldn't. /// ////// Callers must have UIPermission(PermissionState.Unrestricted) to call this API. /// ////// Critical: This is blocked off as defense in depth /// PublicOk: There is a demand here /// public static bool IsThreadModal { [SecurityCritical] get { SecurityHelper.DemandUnrestrictedUIPermission(); ComponentDispatcherThread data = ComponentDispatcher.CurrentThreadData; return data.IsThreadModal; } } ////// Returns "current" message. More exactly the last MSG Raised. /// ////// Callers must have UIPermission(PermissionState.Unrestricted) to call this API. /// ////// Critical: This is blocked off as defense in depth /// PublicOk: There is a demand here /// public static MSG CurrentKeyboardMessage { [SecurityCritical] get { SecurityHelper.DemandUnrestrictedUIPermission(); return ComponentDispatcher.CurrentThreadData.CurrentKeyboardMessage; } } ////// Returns "current" message. More exactly the last MSG Raised. /// ////// Critical: This is blocked off as defense in depth /// internal static MSG UnsecureCurrentKeyboardMessage { [FriendAccessAllowed] // Built into Base, used by Core or Framework. [SecurityCritical] get { return ComponentDispatcher.CurrentThreadData.CurrentKeyboardMessage; } [FriendAccessAllowed] // Built into Base, used by Core or Framework. [SecurityCritical] set { ComponentDispatcher.CurrentThreadData.CurrentKeyboardMessage = value; } } // Methods ////// A component calls this to go modal. Current thread wide only. /// ////// Callers must have UIPermission(PermissionState.Unrestricted) to call this API. /// ////// Critical: This is blocked off as defense in depth /// PublicOk: There is a demand here /// [SecurityCritical] public static void PushModal() { SecurityHelper.DemandUnrestrictedUIPermission(); ComponentDispatcherThread data = ComponentDispatcher.CurrentThreadData; data.PushModal(); } ////// A component calls this to end being modal. /// ////// Callers must have UIPermission(PermissionState.Unrestricted) to call this API. /// ////// Critical: This is blocked off as defense in depth /// PublicOk: There is a demand here /// [SecurityCritical] public static void PopModal() { SecurityHelper.DemandUnrestrictedUIPermission(); ComponentDispatcherThread data = ComponentDispatcher.CurrentThreadData; data.PopModal(); } ////// The message loop pumper calls this when it is time to do idle processing. /// ////// Callers must have UIPermission(PermissionState.Unrestricted) to call this API. /// ////// Critical: This is blocked off as defense in depth /// PublicOk: There is a demand here /// [SecurityCritical] [UIPermissionAttribute(SecurityAction.LinkDemand,Unrestricted=true)] [SuppressMessage("Microsoft.Design", "CA1030:UseEventsWhereAppropriate")] public static void RaiseIdle() { ComponentDispatcherThread data = ComponentDispatcher.CurrentThreadData; data.RaiseIdle(); } ////// The message loop pumper calls this for every keyboard message. /// ////// Callers must have UIPermission(PermissionState.Unrestricted) to call this API. /// ////// Critical: This is blocked off as defense in depth /// PublicOk: There is a demand here /// [SecurityCritical] [SuppressMessage("Microsoft.Design", "CA1030:UseEventsWhereAppropriate")] [SuppressMessage("Microsoft.Design", "CA1045:DoNotPassTypesByReference")] [UIPermissionAttribute(SecurityAction.LinkDemand, Unrestricted = true)] public static bool RaiseThreadMessage(ref MSG msg) { ComponentDispatcherThread data = ComponentDispatcher.CurrentThreadData; return data.RaiseThreadMessage(ref msg); } // Events ////// Components register delegates with this event to handle /// thread idle processing. /// ////// Callers must have UIPermission(PermissionState.Unrestricted) to call this API. /// ////// Critical: This is blocked off as defense in depth /// PublicOk: There is a demand here /// public static event EventHandler ThreadIdle { [SecurityCritical] add { SecurityHelper.DemandUnrestrictedUIPermission(); ComponentDispatcher.CurrentThreadData.ThreadIdle += value; } [SecurityCritical] remove { SecurityHelper.DemandUnrestrictedUIPermission(); ComponentDispatcher.CurrentThreadData.ThreadIdle -= value; } } ////// Components register delegates with this event to handle /// Keyboard Messages (first chance processing). /// ////// Callers must have UIPermission(PermissionState.Unrestricted) to call this API. /// ////// Critical: This is blocked off as defense in depth /// PublicOk: There is a demand here /// [SuppressMessage("Microsoft.Design", "CA1009:DeclareEventHandlersCorrectly")] public static event ThreadMessageEventHandler ThreadFilterMessage { [SecurityCritical] add { SecurityHelper.DemandUnrestrictedUIPermission(); ComponentDispatcher.CurrentThreadData.ThreadFilterMessage += value; } [SecurityCritical] remove { SecurityHelper.DemandUnrestrictedUIPermission(); ComponentDispatcher.CurrentThreadData.ThreadFilterMessage -= value; } } ////// Components register delegates with this event to handle /// Keyboard Messages (second chance processing). /// ////// Callers must have UIPermission(PermissionState.Unrestricted) to call this API. /// ////// Critical: This is blocked off as defense in depth The /// only reason the code for add has a link demand is to /// enable a test scenario for secure.exe. /// PublicOk: There is a demand here /// [SuppressMessage("Microsoft.Design", "CA1009:DeclareEventHandlersCorrectly")] public static event ThreadMessageEventHandler ThreadPreprocessMessage { [UIPermissionAttribute(SecurityAction.LinkDemand, Unrestricted = true)] [SecurityCritical] add { ComponentDispatcher.CurrentThreadData.ThreadPreprocessMessage += value; } [SecurityCritical] remove { SecurityHelper.DemandUnrestrictedUIPermission(); ComponentDispatcher.CurrentThreadData.ThreadPreprocessMessage -= value; } } ////// Components register delegates with this event to handle /// a component on this thread has "gone modal", when previously none were. /// ////// Callers must have UIPermission(PermissionState.Unrestricted) to call this API. /// ////// Critical: This is blocked off as defense in depth /// PublicOk: There is a demand here /// public static event EventHandler EnterThreadModal { [SecurityCritical] add { SecurityHelper.DemandUnrestrictedUIPermission(); ComponentDispatcher.CurrentThreadData.EnterThreadModal += value; } [SecurityCritical] remove { SecurityHelper.DemandUnrestrictedUIPermission(); ComponentDispatcher.CurrentThreadData.EnterThreadModal -= value; } } ////// Components register delegates with this event to handle /// all components on this thread are done being modal. /// ////// Callers must have UIPermission(PermissionState.Unrestricted) to call this API. /// ////// Critical: This is blocked off as defense in depth /// PublicOk: There is a demand here /// public static event EventHandler LeaveThreadModal { [SecurityCritical] add { SecurityHelper.DemandUnrestrictedUIPermission(); ComponentDispatcher.CurrentThreadData.LeaveThreadModal += value; } [SecurityCritical] remove { SecurityHelper.DemandUnrestrictedUIPermission(); ComponentDispatcher.CurrentThreadData.LeaveThreadModal -= value; } } // member data private static System.LocalDataStoreSlot _threadSlot; } }; // File provided for Reference Use Only by Microsoft Corporation (c) 2007. //------------------------------------------------------------------------------ //// Copyright (c) Microsoft Corporation. All rights reserved. // //----------------------------------------------------------------------------- using System; using System.Threading; using System.Diagnostics.CodeAnalysis; using System.Security; using System.Security.Permissions; using MS.Internal; using MS.Win32; using MS.Internal.WindowsBase; namespace System.Windows.Interop { ////// This is the delegate used for registering with the /// ThreadFilterMessage and ThreadPreprocessMessage Events. /// [SuppressMessage("Microsoft.Design", "CA1045:DoNotPassTypesByReference")] public delegate void ThreadMessageEventHandler(ref MSG msg, ref bool handled); ////// This is a static class used to share control of the message pump. /// Whomever is pumping (i.e. calling GetMessage()) will also send /// the messages to RaiseThreadKeyMessage() which will dispatch them to /// the ThreadFilterMessage and then (if not handled) to the ThreadPreprocessMessage /// delegates. That way everyone can be included in the message loop. /// Currently only Keyboard messages are supported. /// There are also Events for Idle and facilities for Thread-Modal operation. /// public static class ComponentDispatcher { static ComponentDispatcher() { _threadSlot = Thread.AllocateDataSlot(); } private static ComponentDispatcherThread CurrentThreadData { get { ComponentDispatcherThread data; object obj = Thread.GetData(_threadSlot); if(null == obj) { data = new ComponentDispatcherThread(); Thread.SetData(_threadSlot, data); } else { data = (ComponentDispatcherThread) obj; } return data; } } // Properties ////// Returns true if one or more components has gone modal. /// Although once one component is modal a 2nd shouldn't. /// ////// Callers must have UIPermission(PermissionState.Unrestricted) to call this API. /// ////// Critical: This is blocked off as defense in depth /// PublicOk: There is a demand here /// public static bool IsThreadModal { [SecurityCritical] get { SecurityHelper.DemandUnrestrictedUIPermission(); ComponentDispatcherThread data = ComponentDispatcher.CurrentThreadData; return data.IsThreadModal; } } ////// Returns "current" message. More exactly the last MSG Raised. /// ////// Callers must have UIPermission(PermissionState.Unrestricted) to call this API. /// ////// Critical: This is blocked off as defense in depth /// PublicOk: There is a demand here /// public static MSG CurrentKeyboardMessage { [SecurityCritical] get { SecurityHelper.DemandUnrestrictedUIPermission(); return ComponentDispatcher.CurrentThreadData.CurrentKeyboardMessage; } } ////// Returns "current" message. More exactly the last MSG Raised. /// ////// Critical: This is blocked off as defense in depth /// internal static MSG UnsecureCurrentKeyboardMessage { [FriendAccessAllowed] // Built into Base, used by Core or Framework. [SecurityCritical] get { return ComponentDispatcher.CurrentThreadData.CurrentKeyboardMessage; } [FriendAccessAllowed] // Built into Base, used by Core or Framework. [SecurityCritical] set { ComponentDispatcher.CurrentThreadData.CurrentKeyboardMessage = value; } } // Methods ////// A component calls this to go modal. Current thread wide only. /// ////// Callers must have UIPermission(PermissionState.Unrestricted) to call this API. /// ////// Critical: This is blocked off as defense in depth /// PublicOk: There is a demand here /// [SecurityCritical] public static void PushModal() { SecurityHelper.DemandUnrestrictedUIPermission(); ComponentDispatcherThread data = ComponentDispatcher.CurrentThreadData; data.PushModal(); } ////// A component calls this to end being modal. /// ////// Callers must have UIPermission(PermissionState.Unrestricted) to call this API. /// ////// Critical: This is blocked off as defense in depth /// PublicOk: There is a demand here /// [SecurityCritical] public static void PopModal() { SecurityHelper.DemandUnrestrictedUIPermission(); ComponentDispatcherThread data = ComponentDispatcher.CurrentThreadData; data.PopModal(); } ////// The message loop pumper calls this when it is time to do idle processing. /// ////// Callers must have UIPermission(PermissionState.Unrestricted) to call this API. /// ////// Critical: This is blocked off as defense in depth /// PublicOk: There is a demand here /// [SecurityCritical] [UIPermissionAttribute(SecurityAction.LinkDemand,Unrestricted=true)] [SuppressMessage("Microsoft.Design", "CA1030:UseEventsWhereAppropriate")] public static void RaiseIdle() { ComponentDispatcherThread data = ComponentDispatcher.CurrentThreadData; data.RaiseIdle(); } ////// The message loop pumper calls this for every keyboard message. /// ////// Callers must have UIPermission(PermissionState.Unrestricted) to call this API. /// ////// Critical: This is blocked off as defense in depth /// PublicOk: There is a demand here /// [SecurityCritical] [SuppressMessage("Microsoft.Design", "CA1030:UseEventsWhereAppropriate")] [SuppressMessage("Microsoft.Design", "CA1045:DoNotPassTypesByReference")] [UIPermissionAttribute(SecurityAction.LinkDemand, Unrestricted = true)] public static bool RaiseThreadMessage(ref MSG msg) { ComponentDispatcherThread data = ComponentDispatcher.CurrentThreadData; return data.RaiseThreadMessage(ref msg); } // Events ////// Components register delegates with this event to handle /// thread idle processing. /// ////// Callers must have UIPermission(PermissionState.Unrestricted) to call this API. /// ////// Critical: This is blocked off as defense in depth /// PublicOk: There is a demand here /// public static event EventHandler ThreadIdle { [SecurityCritical] add { SecurityHelper.DemandUnrestrictedUIPermission(); ComponentDispatcher.CurrentThreadData.ThreadIdle += value; } [SecurityCritical] remove { SecurityHelper.DemandUnrestrictedUIPermission(); ComponentDispatcher.CurrentThreadData.ThreadIdle -= value; } } ////// Components register delegates with this event to handle /// Keyboard Messages (first chance processing). /// ////// Callers must have UIPermission(PermissionState.Unrestricted) to call this API. /// ////// Critical: This is blocked off as defense in depth /// PublicOk: There is a demand here /// [SuppressMessage("Microsoft.Design", "CA1009:DeclareEventHandlersCorrectly")] public static event ThreadMessageEventHandler ThreadFilterMessage { [SecurityCritical] add { SecurityHelper.DemandUnrestrictedUIPermission(); ComponentDispatcher.CurrentThreadData.ThreadFilterMessage += value; } [SecurityCritical] remove { SecurityHelper.DemandUnrestrictedUIPermission(); ComponentDispatcher.CurrentThreadData.ThreadFilterMessage -= value; } } ////// Components register delegates with this event to handle /// Keyboard Messages (second chance processing). /// ////// Callers must have UIPermission(PermissionState.Unrestricted) to call this API. /// ////// Critical: This is blocked off as defense in depth The /// only reason the code for add has a link demand is to /// enable a test scenario for secure.exe. /// PublicOk: There is a demand here /// [SuppressMessage("Microsoft.Design", "CA1009:DeclareEventHandlersCorrectly")] public static event ThreadMessageEventHandler ThreadPreprocessMessage { [UIPermissionAttribute(SecurityAction.LinkDemand, Unrestricted = true)] [SecurityCritical] add { ComponentDispatcher.CurrentThreadData.ThreadPreprocessMessage += value; } [SecurityCritical] remove { SecurityHelper.DemandUnrestrictedUIPermission(); ComponentDispatcher.CurrentThreadData.ThreadPreprocessMessage -= value; } } ////// Components register delegates with this event to handle /// a component on this thread has "gone modal", when previously none were. /// ////// Callers must have UIPermission(PermissionState.Unrestricted) to call this API. /// ////// Critical: This is blocked off as defense in depth /// PublicOk: There is a demand here /// public static event EventHandler EnterThreadModal { [SecurityCritical] add { SecurityHelper.DemandUnrestrictedUIPermission(); ComponentDispatcher.CurrentThreadData.EnterThreadModal += value; } [SecurityCritical] remove { SecurityHelper.DemandUnrestrictedUIPermission(); ComponentDispatcher.CurrentThreadData.EnterThreadModal -= value; } } ////// Components register delegates with this event to handle /// all components on this thread are done being modal. /// ////// Callers must have UIPermission(PermissionState.Unrestricted) to call this API. /// ////// Critical: This is blocked off as defense in depth /// PublicOk: There is a demand here /// public static event EventHandler LeaveThreadModal { [SecurityCritical] add { SecurityHelper.DemandUnrestrictedUIPermission(); ComponentDispatcher.CurrentThreadData.LeaveThreadModal += value; } [SecurityCritical] remove { SecurityHelper.DemandUnrestrictedUIPermission(); ComponentDispatcher.CurrentThreadData.LeaveThreadModal -= value; } } // member data private static System.LocalDataStoreSlot _threadSlot; } }; // File provided for Reference Use Only by Microsoft Corporation (c) 2007.
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- StylusDevice.cs
- WrappingXamlSchemaContext.cs
- Italic.cs
- WaitForChangedResult.cs
- XmlValidatingReader.cs
- HashAlgorithm.cs
- PTConverter.cs
- CssStyleCollection.cs
- RootBuilder.cs
- FontCollection.cs
- RadioButtonFlatAdapter.cs
- Size3D.cs
- XslException.cs
- FileStream.cs
- UIElement3D.cs
- InfoCardSymmetricAlgorithm.cs
- BinaryReader.cs
- PagesSection.cs
- XhtmlConformanceSection.cs
- ZipIOCentralDirectoryFileHeader.cs
- TextTabProperties.cs
- MemberAccessException.cs
- ApplicationBuildProvider.cs
- SecurityIdentifierConverter.cs
- TraceHandlerErrorFormatter.cs
- ThreadStartException.cs
- VariableValue.cs
- StateRuntime.cs
- PenContexts.cs
- DataServiceRequestException.cs
- HttpCookieCollection.cs
- InputReferenceExpression.cs
- HttpRuntimeSection.cs
- QueuePathEditor.cs
- ComNativeDescriptor.cs
- XmlComment.cs
- WpfSharedXamlSchemaContext.cs
- DecoderFallbackWithFailureFlag.cs
- HwndSubclass.cs
- UserControlAutomationPeer.cs
- CacheMode.cs
- TabletDevice.cs
- SoundPlayer.cs
- CallId.cs
- WinInet.cs
- UInt16Storage.cs
- SystemResources.cs
- EpmContentSerializerBase.cs
- NotifyInputEventArgs.cs
- Mapping.cs
- CuspData.cs
- EnumerableCollectionView.cs
- httpapplicationstate.cs
- MatchingStyle.cs
- sitestring.cs
- ConsumerConnectionPointCollection.cs
- LeaseManager.cs
- ValidationRuleCollection.cs
- HMACSHA256.cs
- UInt16.cs
- XmlNodeList.cs
- RecognitionResult.cs
- CachingHintValidation.cs
- HtmlInputRadioButton.cs
- HtmlControl.cs
- ControlDesigner.cs
- StringPropertyBuilder.cs
- DataGridItemEventArgs.cs
- ConditionalAttribute.cs
- TextEditor.cs
- XmlSerializerVersionAttribute.cs
- safelinkcollection.cs
- CodeIterationStatement.cs
- TextChange.cs
- TraceHandlerErrorFormatter.cs
- SQLGuidStorage.cs
- Blend.cs
- ConstraintEnumerator.cs
- JoinSymbol.cs
- DbQueryCommandTree.cs
- WebPartMenuStyle.cs
- TextTreeInsertUndoUnit.cs
- Region.cs
- AggregateNode.cs
- CharacterBufferReference.cs
- FormClosedEvent.cs
- SQLInt64.cs
- SyndicationDeserializer.cs
- TypeSystemHelpers.cs
- _ProxyRegBlob.cs
- PropertyInfoSet.cs
- MaxMessageSizeStream.cs
- CompositeFontParser.cs
- XmlAnyElementAttribute.cs
- IndentedTextWriter.cs
- TextBoxBase.cs
- ToolStripDesignerUtils.cs
- LZCodec.cs
- ProcessManager.cs
- OrderedHashRepartitionEnumerator.cs