File: Core\CSharp\System\Windows\Input\RawMouseInputReport.cs
Project: wpf\src\PresentationCore.csproj (PresentationCore)
using System.Windows.Media; // 
using System.Security;
using System.Security.Permissions;
using MS.Internal;
using MS.Internal.PresentationCore;
using MS.Win32;
using System;
 
namespace System.Windows.Input 
{
    /// <summary>
    ///     The RawMouseInputReport class encapsulates the raw input provided
    ///     from a mouse.
    /// </summary>
    /// <remarks>
    ///     It is important to note that the InputReport class only contains
    ///     blittable types.  This is required so that the report can be
    ///     marshalled across application domains.
    /// </remarks>
    [FriendAccessAllowed]
    internal class RawMouseInputReport : InputReport
    {
        /// <summary>
        ///     Constructs ad instance of the RawMouseInputReport class.
        /// </summary>
        /// <param name="mode">
        ///     The mode in which the input is being provided.
        /// </param>
        /// <param name="timestamp">
        ///     The time when the input occured.
        /// </param>
        /// <param name="inputSource">
        ///     The PresentationSource over which the mouse is moved.
        /// </param>
        /// <param name="actions">
        ///     The set of actions being reported.
        /// </param>
        /// <param name="x">
        ///     If horizontal position being reported.
        /// </param>
        /// <param name="y">
        ///     If vertical position being reported.
        /// </param>
        /// <param name="wheel">
        ///     If wheel delta being reported.
        /// </param>
        /// <param name="extraInformation">
        ///     Any extra information being provided along with the input.
        /// </param>
        /// <SecurityNote>
        ///     Critical:This handles critical data in the form of PresentationSource and ExtraInformation 
        ///     TreatAsSafe:There are demands on the  critical data(PresentationSource/ExtraInformation)
        /// </SecurityNote>
        [SecurityCritical, SecurityTreatAsSafe]
        public RawMouseInputReport(
            InputMode mode,
            int timestamp, 
            PresentationSource inputSource,
            RawMouseActions actions, 
            int x, 
            int y, 
            int wheel, 
            IntPtr extraInformation) : base(inputSource, InputType.Mouse, mode, timestamp)
        {
            if (!IsValidRawMouseActions(actions))
                throw new System.ComponentModel.InvalidEnumArgumentException("actions", (int)actions, typeof(RawMouseActions));
 
            /* we pass a null state from MouseDevice.PreProcessorInput, so null is valid value for state */
            _actions = actions;
            _x = x;
            _y = y;
            _wheel = wheel;
            _extraInformation = new SecurityCriticalData<IntPtr>(extraInformation);
        }
 
        /// <summary>
        ///     Read-only access to the set of actions that were reported.
        /// </summary>
        public RawMouseActions Actions {get {return _actions;}}
 
        /// <summary>
        ///     Read-only access to the horizontal position that was reported.
        /// </summary>
        public int X {get {return _x;}}
 
        /// <summary>
        ///     Read-only access to the vertical position that was reported.
        /// </summary>
        public int Y {get {return _y;}}
 
        /// <summary>
        ///     Read-only access to the wheel delta that was reported.
        /// </summary>
        public int Wheel {get {return _wheel;}}
 
        /// <summary>
        ///     Read-only access to the extra information was provided along
        ///     with the input.
        /// </summary>
        /// <SecurityNote>
        ///     Critical: This data was got under an elevation. There exists a link demand to 
        ///     block access. The critical exists to catch new callers too.
        /// </SecurityNote>
        public IntPtr ExtraInformation 
        {
            [SecurityCritical]
            get 
            {
                return _extraInformation.Value;
            }
        }
 
        // IsValid Method for RawMouseActions. Relies on the enum being flags.
        internal static bool IsValidRawMouseActions(RawMouseActions actions)
        {
            if (actions == RawMouseActions.None)
                return true;
 
            if ((( RawMouseActions.AttributesChanged | RawMouseActions.Activate | RawMouseActions.Deactivate |
                  RawMouseActions.RelativeMove | RawMouseActions.AbsoluteMove | RawMouseActions.VirtualDesktopMove |
                  RawMouseActions.Button1Press | RawMouseActions.Button1Release |
                  RawMouseActions.Button2Press | RawMouseActions.Button2Release |
                  RawMouseActions.Button3Press | RawMouseActions.Button3Release |
                  RawMouseActions.Button4Press | RawMouseActions.Button4Release |
                  RawMouseActions.Button5Press | RawMouseActions.Button5Release |
                  RawMouseActions.VerticalWheelRotate | RawMouseActions.HorizontalWheelRotate |
                  RawMouseActions.CancelCapture |
                  RawMouseActions.QueryCursor) & actions) == actions)
            {
                if (!(((RawMouseActions.Deactivate & actions) == actions && RawMouseActions.Deactivate != actions ) ||
                      (((RawMouseActions.Button1Press | RawMouseActions.Button1Release) & actions) == (RawMouseActions.Button1Press | RawMouseActions.Button1Release)) ||
                      (((RawMouseActions.Button2Press | RawMouseActions.Button2Release) & actions) == (RawMouseActions.Button2Press | RawMouseActions.Button2Release)) ||
                      (((RawMouseActions.Button3Press | RawMouseActions.Button3Release) & actions) == (RawMouseActions.Button3Press | RawMouseActions.Button3Release)) ||
                      (((RawMouseActions.Button4Press | RawMouseActions.Button4Release) & actions) == (RawMouseActions.Button4Press | RawMouseActions.Button4Release)) ||
                      (((RawMouseActions.Button5Press | RawMouseActions.Button5Release) & actions) == (RawMouseActions.Button5Press | RawMouseActions.Button5Release))))
                {
                    return true;
                }
            }
            return false;
        }
 
        private RawMouseActions _actions;
        private int _x;
        private int _y;
        private int _wheel;
        
        internal bool _isSynchronize; // Set from MouseDevice.Synchronize.
        
        /// <SecurityNote>
        ///     Critical:This data was got under an elevation and is not safe to expose.
        /// </SecurityNote>
        private SecurityCriticalData<IntPtr> _extraInformation;
    }    
}