File: winforms\Managed\System\WinForms\DisplayInformation.cs
Project: ndp\fx\src\System.Windows.Forms.csproj (System.Windows.Forms)
//------------------------------------------------------------------------------
// <copyright file="DisplayInformation.cs" company="Microsoft">
//     Copyright (c) Microsoft Corporation.  All rights reserved.
// </copyright>
//------------------------------------------------------------------------------
/*
 */
 
namespace System.Windows.Forms {
    using Microsoft.Win32;
    using System.Security;
    using System.Security.Permissions;
    
    internal class DisplayInformation {
        
        private static bool highContrast;               //whether we are under hight contrast mode
        private static bool lowRes;                     //whether we are under low resolution mode
        private static bool isTerminalServerSession;    //whether this application is run on a terminal server (remote desktop)
        private static bool highContrastSettingValid;   //indicates whether the high contrast setting is correct
        private static bool lowResSettingValid;         //indicates whether the low resolution setting is correct
        private static bool terminalSettingValid;       //indicates whether the terminal server setting is correct
        private static short bitsPerPixel;
        private static bool dropShadowSettingValid;
        private static bool dropShadowEnabled;
        private static bool menuAccessKeysUnderlinedValid;
        private static bool menuAccessKeysUnderlined;
    
    
        static DisplayInformation() {
            SystemEvents.UserPreferenceChanging += new UserPreferenceChangingEventHandler(UserPreferenceChanging);
            SystemEvents.DisplaySettingsChanging += new EventHandler(DisplaySettingsChanging); 
        }
 
        public static short BitsPerPixel {
           get {
               if (bitsPerPixel == 0) {
                    // we used to iterate through all screens, but 
                    // for some reason unused screens can temparily appear 
                    // in the AllScreens collection - we would honor the display
                    // setting of an unused screen.  
                    // According to EnumDisplayMonitors, a primary screen check should be sufficient 
                    bitsPerPixel = (short)Screen.PrimaryScreen.BitsPerPixel;
                    
               }
               return bitsPerPixel;
           }
       }
 
        ///<devdoc>
        ///tests to see if the monitor is in low resolution mode (8-bit color depth or less).
        ///</devdoc>
        public static bool LowResolution {
            get {
                
                if (lowResSettingValid && !lowRes) {
                    return lowRes;
                }
                // dont cache if we're in low resolution.  
                lowRes = BitsPerPixel <= 8;
                lowResSettingValid = true;
                return lowRes;
            }
        }
 
        ///<devdoc>
        ///tests to see if we are under high contrast mode
        ///</devdoc>
        public static bool HighContrast {
            get {
                if (highContrastSettingValid) {
                    return highContrast;
                }
                highContrast = SystemInformation.HighContrast;
                highContrastSettingValid = true;
                return highContrast;
            }
        }
        public static bool IsDropShadowEnabled {
            get {
                if (dropShadowSettingValid) {
                    return dropShadowEnabled;
                }
                dropShadowEnabled = SystemInformation.IsDropShadowEnabled;
                dropShadowSettingValid = true;
                return dropShadowEnabled;
            }
        }
 
        ///<devdoc>
        ///test to see if we are under terminal server mode
        ///</devdoc>
        public static bool TerminalServer {
            get {
                if (terminalSettingValid) {
                    return isTerminalServerSession;
                }
 
                isTerminalServerSession = SystemInformation.TerminalServerSession;
                terminalSettingValid = true;
                return isTerminalServerSession;
            }
        }
 
        // return if mnemonic underlines should always be there regardless of ALT
        public static bool MenuAccessKeysUnderlined {
            get {
                 if (menuAccessKeysUnderlinedValid) {
                     return menuAccessKeysUnderlined;
                 }
                 menuAccessKeysUnderlined = SystemInformation.MenuAccessKeysUnderlined;
                 menuAccessKeysUnderlinedValid = true;
                 return menuAccessKeysUnderlined;
            }
        }
 
        ///<devdoc>
        ///event handler for change in display setting
        ///</devdoc>
        private static void DisplaySettingsChanging(object obj, EventArgs ea)
        {    
            highContrastSettingValid = false;
            lowResSettingValid = false;
            terminalSettingValid = false;
            dropShadowSettingValid = false;
            menuAccessKeysUnderlinedValid = false;
 
        }
 
        ///<devdoc>
        ///event handler for change in user preference
        ///</devdoc>
        private static void UserPreferenceChanging(object obj, UserPreferenceChangingEventArgs e) {
            highContrastSettingValid = false;
            lowResSettingValid = false;
            terminalSettingValid = false;
            dropShadowSettingValid = false;
            bitsPerPixel = 0;
            
            if (e.Category == UserPreferenceCategory.General) {
                menuAccessKeysUnderlinedValid =false;
            }
        }
    }
    }