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
- XsdValidatingReader.cs
- Control.cs
- LingerOption.cs
- XmlSchemaComplexContentRestriction.cs
- MailAddressCollection.cs
- LocationReferenceEnvironment.cs
- Constants.cs
- Array.cs
- FormClosedEvent.cs
- FontWeight.cs
- BuildManager.cs
- TreeViewDesigner.cs
- BuildProvider.cs
- TypedElement.cs
- XmlObjectSerializer.cs
- OdbcConnectionOpen.cs
- ToolStripItemTextRenderEventArgs.cs
- RuntimeArgumentHandle.cs
- TextTreeExtractElementUndoUnit.cs
- ColorComboBox.cs
- MergeFailedEvent.cs
- DataGridViewColumn.cs
- OneOfElement.cs
- WebPartZoneBaseDesigner.cs
- HttpCapabilitiesSectionHandler.cs
- GridProviderWrapper.cs
- CLSCompliantAttribute.cs
- TemplatedWizardStep.cs
- HttpProfileBase.cs
- ConfigurationSection.cs
- SafeCloseHandleCritical.cs
- QilNode.cs
- SpeechEvent.cs
- OperationAbortedException.cs
- FontFamily.cs
- TextFormatterImp.cs
- DataControlImageButton.cs
- PasswordTextNavigator.cs
- NumericPagerField.cs
- WindowsFormsSynchronizationContext.cs
- XamlFilter.cs
- X509ChainPolicy.cs
- FixedSOMLineCollection.cs
- EdmRelationshipNavigationPropertyAttribute.cs
- HwndSource.cs
- Sentence.cs
- SmiContext.cs
- PopupControlService.cs
- CompensableActivity.cs
- FrameSecurityDescriptor.cs
- Viewport3DAutomationPeer.cs
- DataGridViewElement.cs
- RelatedEnd.cs
- TimeIntervalCollection.cs
- MouseGestureConverter.cs
- DBCommand.cs
- ADMembershipProvider.cs
- TextPointer.cs
- ToolboxBitmapAttribute.cs
- Color.cs
- MdiWindowListStrip.cs
- OpenTypeLayoutCache.cs
- TileModeValidation.cs
- PageBuildProvider.cs
- DataGridViewAutoSizeColumnsModeEventArgs.cs
- UserPreference.cs
- SqlVisitor.cs
- ListViewAutomationPeer.cs
- RecipientIdentity.cs
- IgnoreFileBuildProvider.cs
- XmlImplementation.cs
- InputReferenceExpression.cs
- ImageAutomationPeer.cs
- StringCollection.cs
- Panel.cs
- ParamArrayAttribute.cs
- DataObjectPastingEventArgs.cs
- PointCollection.cs
- UnSafeCharBuffer.cs
- AlternateView.cs
- RedirectionProxy.cs
- FormViewInsertEventArgs.cs
- SynchronizationContext.cs
- CodeMethodReturnStatement.cs
- IndexerNameAttribute.cs
- serverconfig.cs
- SoapIgnoreAttribute.cs
- NegotiationTokenAuthenticator.cs
- Pair.cs
- ApplicationManager.cs
- CutCopyPasteHelper.cs
- PropertyInformation.cs
- PropertyTabChangedEvent.cs
- TrackingMemoryStreamFactory.cs
- SamlAdvice.cs
- BezierSegment.cs
- WebBrowserPermission.cs
- RuleConditionDialog.cs
- DataGrid.cs
- ZipPackage.cs