HwndAppCommandInputProvider.cs source code in C# .NET

Source code for the .NET framework in C#

                        

Code:

/ 4.0 / 4.0 / untmp / DEVDIV_TFS / Dev10 / Releases / RTMRel / wpf / src / Core / CSharp / System / Windows / InterOp / HwndAppCommandInputProvider.cs / 1305600 / HwndAppCommandInputProvider.cs

                            using System.Windows.Input; 
using System.Windows.Media;
using System.Windows.Threading;
using System.Diagnostics;
using System.Runtime.InteropServices; 
using System.Security;
using System.Security.Permissions; 
using MS.Utility; 
using MS.Internal;
using MS.Internal.Interop; 
using MS.Win32;

namespace System.Windows.Interop
{ 
    internal sealed class HwndAppCommandInputProvider : DispatcherObject, IInputProvider, IDisposable
    { 
        ///  
        /// Accesses and store critical data. This class is also critical (_site and _source)
        ///  
        [SecurityCritical]
        internal HwndAppCommandInputProvider( HwndSource source )
        {
            (new UIPermission(PermissionState.Unrestricted)).Assert(); 
            try
            { 
                 _site = new SecurityCriticalDataClass(InputManager.Current.RegisterInputProvider(this)); 
            }
            finally 
            {
                UIPermission.RevertAssert();
            }
            _source = new SecurityCriticalDataClass(source); 
        }
 
        ///  
        /// Critical:This class accesses critical data, _site.
        /// TreatAsSafe: This class does not expose the critical data 
        /// 
        [SecurityCritical, SecurityTreatAsSafe]
        public void Dispose( )
        { 
            if (_site != null)
            { 
                _site.Value.Dispose(); 
                _site = null;
            } 
            _source = null;
        }

        ///  
        /// Critical: As this accesses critical data HwndSource
        /// TreatAsSafe:Information about whether a given input provider services 
        /// a visual is safe to expose. This method does not expose the critical data either. 
        /// 
        [SecurityCritical, SecurityTreatAsSafe] 
        bool IInputProvider.ProvidesInputForRootVisual( Visual v )
        {
            Debug.Assert(null != _source);
            return _source.Value.RootVisual == v; 
        }
 
        void IInputProvider.NotifyDeactivate() {} 

        ///  
        /// Critical: As this accesses critical data HwndSource
        /// 
        [SecurityCritical]
        internal IntPtr FilterMessage( IntPtr hwnd, WindowMessage msg, IntPtr wParam, IntPtr lParam, ref bool handled ) 
        {
            // It is possible to be re-entered during disposal.  Just return. 
            if(null == _source || null == _source.Value) 
            {
                return IntPtr.Zero; 
            }

            if (msg == WindowMessage.WM_APPCOMMAND)
            { 
                // WM_APPCOMMAND message notifies a window that the user generated an application command event,
                // for example, by clicking an application command button using the mouse or typing an application command 
                // key on the keyboard. 
                RawAppCommandInputReport report = new RawAppCommandInputReport(
                                                        _source.Value, 
                                                        InputMode.Foreground,
                                                        SafeNativeMethods.GetMessageTime(),
                                                        GetAppCommand(lParam),
                                                        GetDevice(lParam), 
                                                        InputType.Command);
 
                handled = _site.Value.ReportInput(report); 
            }
 
            return handled ? new IntPtr(1) : IntPtr.Zero ;
        }

        ///  
        /// Implementation of the GET_APPCOMMAND_LPARAM macro defined in Winuser.h
        ///  
        ///  
        /// 
        private static int GetAppCommand( IntPtr lParam ) 
        {
            return ((short)(NativeMethods.SignedHIWORD(NativeMethods.IntPtrToInt32(lParam)) & ~NativeMethods.FAPPCOMMAND_MASK));
        }
 
        /// 
        /// Returns the input device that originated this app command. 
        /// InputType.Hid represents an unspecified device that is neither the 
        /// keyboard nor the mouse.
        ///  
        /// 
        /// 
        private static InputType GetDevice(IntPtr lParam)
        { 
            InputType inputType = InputType.Hid;
 
            // Implementation of the GET_DEVICE_LPARAM macro defined in Winuser.h 
            // Returns either FAPPCOMMAND_KEY (the user pressed a key), FAPPCOMMAND_MOUSE
            // (the user clicked a mouse button) or FAPPCOMMAND_OEM (unknown device) 
            ushort  deviceId = (ushort)(NativeMethods.SignedHIWORD(NativeMethods.IntPtrToInt32(lParam)) & NativeMethods.FAPPCOMMAND_MASK);

            switch (deviceId)
            { 
                case NativeMethods.FAPPCOMMAND_MOUSE:
                    inputType = InputType.Mouse; 
                    break; 

                case NativeMethods.FAPPCOMMAND_KEY: 
                    inputType =  InputType.Keyboard;
                    break;

                case NativeMethods.FAPPCOMMAND_OEM: 
                default:
                    // Unknown device id or FAPPCOMMAND_OEM. 
                    // In either cases we set it to the generic human interface device. 
                    inputType=InputType.Hid;
                    break; 
            }

            return inputType;
        } 

        ///  
        /// This is got under an elevation and is hence critical. This data is not ok to expose. 
        /// 
        private SecurityCriticalDataClass _source; 

        /// 
        /// This is got under an elevation and is hence critical.This data is not ok to expose.
        ///  
        private SecurityCriticalDataClass _site;
    } 
} 

 

// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
// Copyright (c) Microsoft Corporation. All rights reserved.


                        

Link Menu

Network programming in C#, Network Programming in VB.NET, Network Programming in .NET
This book is available now!
Buy at Amazon US or
Buy at Amazon UK