Code:
/ DotNET / DotNET / 8.0 / untmp / WIN_WINDOWS / lh_tools_devdiv_wpf / Windows / wcp / Framework / System / Windows / Documents / WinEventHandler.cs / 2 / WinEventHandler.cs
//----------------------------------------------------------------------------
//
//
// Copyright (C) Microsoft Corporation. All rights reserved.
//
//
//
// Description: WinEventHandler implementation.
//
// History:
// 02/04/2005 : [....] - created.
//
//---------------------------------------------------------------------------
using System;
using System.Collections;
using System.Runtime.InteropServices;
using System.ComponentModel;
using System.Diagnostics;
using System.Security;
using System.Security.Permissions;
using System.Windows.Threading;
using MS.Win32;
using MS.Internal;
namespace System.Windows.Documents
{
internal class WinEventHandler : IDisposable
{
//-----------------------------------------------------
//
// Constructors
//
//-----------------------------------------------------
#region Constructors
// ctor that takes a range of events
///
/// Critical - as this calls the setter for _winEventProc.Value.
/// Safe - as this doesn't allow an arbitrary value to be set.
///
[SecurityCritical, SecurityTreatAsSafe]
internal WinEventHandler(int eventMin, int eventMax)
{
_eventMin = eventMin;
_eventMax = eventMax;
_winEventProc.Value = new NativeMethods.WinEventProcDef(WinEventDefaultProc);
// Keep the garbage collector from moving things around
_gchThis = GCHandle.Alloc(_winEventProc.Value);
// Workaround for bug 150666.
Dispatcher dispatcher = Dispatcher.CurrentDispatcher;
if (dispatcher != null)
{
dispatcher.ShutdownFinished += new EventHandler(OnDispatcherShutDown);
}
}
~WinEventHandler()
{
Clear();
}
#endregion Constructors
//------------------------------------------------------
//
// Internal Methods
//
//-----------------------------------------------------
#region Internal Methods
public void Dispose()
{
// no need to call this finalizer.
GC.SuppressFinalize(this);
Clear();
}
// callback for the class inherited from this.
internal virtual void WinEventProc(int eventId, IntPtr hwnd)
{
}
///
/// Critical: This code frees the gchandle and is critical because it calls GCHandle
/// TreatAsSafe: Ok to call free on a handle that we have allocated
///
[SecurityCritical,SecurityTreatAsSafe]
internal void Clear()
{
// Make sure that the hooks is uninitialzied.
Stop();
// free GC handle.
if (_gchThis.IsAllocated)
{
_gchThis.Free();
}
}
// install WinEvent hook and start getting the callback.
///
/// Critical - as this calls SetWinEventHook which has a SUC on it and also calls
/// the setter for _hHook.
/// Safe - as this does not allow an arbitrary method to be set up as a hook and
/// also doesn't allow an aribtrary value to be set on _hHook.Value.
///
[SecurityCritical, SecurityTreatAsSafe]
internal void Start()
{
if (_gchThis.IsAllocated)
{
_hHook.Value = UnsafeNativeMethods.SetWinEventHook(_eventMin, _eventMax, IntPtr.Zero, _winEventProc.Value,
0, 0, NativeMethods.WINEVENT_OUTOFCONTEXT);
if (_hHook.Value == IntPtr.Zero )
{
Stop();
}
}
}
// uninstall WinEvent hook.
///
/// Critical - as this calls UnhookWinEvent which has a SUC on it and also
/// calls the setter for _hHook.Value.
/// Safe - as this does not allow an arbitrary hook to be removed and sets
/// _hHook.Value to IntPtr.Zero which is safe.
///
[SecurityCritical, SecurityTreatAsSafe]
internal void Stop()
{
if (_hHook.Value != IntPtr.Zero )
{
UnsafeNativeMethods.UnhookWinEvent(_hHook.Value);
_hHook.Value = IntPtr.Zero ;
}
}
#endregion Internal Methods
//------------------------------------------------------
//
// Private Methods
//
//------------------------------------------------------
#region Private Methods
private void WinEventDefaultProc(int winEventHook, int eventId, IntPtr hwnd, int idObject, int idChild, int eventThread, int eventTime)
{
WinEventProc(eventId , hwnd);
}
// Workaround for bug 150666.
private void OnDispatcherShutDown(object sender, EventArgs args)
{
Stop();
}
#endregion Private Methods
//-----------------------------------------------------
//
// Private Fields
//
//------------------------------------------------------
#region Private Fields
// min WinEvent.
private int _eventMin;
// max WinEvent.
private int _eventMax;
// hook handle
private SecurityCriticalDataForSet _hHook;
// the callback.
private SecurityCriticalDataForSet _winEventProc;
// GCHandle to keep the garbage collector from moving things around
private GCHandle _gchThis;
#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
- PassportAuthenticationEventArgs.cs
- EdmComplexTypeAttribute.cs
- DateTimePicker.cs
- Parameter.cs
- SerializationAttributes.cs
- StringCollection.cs
- LinkLabel.cs
- EtwTrace.cs
- StringHandle.cs
- Baml2006KnownTypes.cs
- Expr.cs
- DataGridViewImageCell.cs
- GPRECT.cs
- HttpStreamMessage.cs
- ProfileParameter.cs
- Menu.cs
- QuaternionConverter.cs
- SQLInt16Storage.cs
- WebPartChrome.cs
- SByteStorage.cs
- UserControl.cs
- IgnoreDataMemberAttribute.cs
- CreateUserErrorEventArgs.cs
- OdbcStatementHandle.cs
- CompressEmulationStream.cs
- Win32.cs
- TableLayoutStyleCollection.cs
- CodePrimitiveExpression.cs
- DataConnectionHelper.cs
- BamlLocalizableResourceKey.cs
- Condition.cs
- CommandHelper.cs
- ProtectedConfigurationSection.cs
- PersonalizationEntry.cs
- Focus.cs
- RSAPKCS1KeyExchangeFormatter.cs
- MatrixCamera.cs
- XmlElementCollection.cs
- ConfigPathUtility.cs
- ParameterInfo.cs
- ClientUrlResolverWrapper.cs
- KeyFrames.cs
- DisableDpiAwarenessAttribute.cs
- EncoderExceptionFallback.cs
- BorderGapMaskConverter.cs
- CatalogZoneBase.cs
- DependencyObjectProvider.cs
- SqlClientWrapperSmiStream.cs
- MembershipUser.cs
- XmlQueryContext.cs
- CodeComment.cs
- ToolStripProfessionalLowResolutionRenderer.cs
- SqlConnection.cs
- CodeChecksumPragma.cs
- SystemThemeKey.cs
- DesignerTextBoxAdapter.cs
- IFlowDocumentViewer.cs
- DataGridViewColumnHeaderCell.cs
- ApplyTemplatesAction.cs
- ObjectDataSourceDisposingEventArgs.cs
- Stopwatch.cs
- Rotation3DAnimation.cs
- GeometryCollection.cs
- SerializerProvider.cs
- DbParameterCollection.cs
- StreamGeometry.cs
- RangeExpression.cs
- JournalEntry.cs
- HttpCacheVary.cs
- StoragePropertyMapping.cs
- ContentTextAutomationPeer.cs
- ETagAttribute.cs
- XmlTextWriter.cs
- ValidationSummary.cs
- RegisteredArrayDeclaration.cs
- XPathItem.cs
- ViewCellRelation.cs
- MetadataArtifactLoaderResource.cs
- PolicyValidationException.cs
- PkcsMisc.cs
- Exceptions.cs
- TransportBindingElementImporter.cs
- Debugger.cs
- MatrixStack.cs
- MemberDomainMap.cs
- XamlTypeMapper.cs
- DBNull.cs
- StorageAssociationTypeMapping.cs
- EntityDataSourceWizardForm.cs
- WsatProxy.cs
- ForeignConstraint.cs
- OleDbReferenceCollection.cs
- AndCondition.cs
- SystemIcons.cs
- NameObjectCollectionBase.cs
- PrincipalPermission.cs
- QueryOptionExpression.cs
- TagMapCollection.cs
- FontSizeConverter.cs
- MetaDataInfo.cs