Пример #1
0
        public void SetIntegratedDisplayBrightness(uint brightness)
        {
            if (m_wmiBrightnessControls == null)
            {
                return;
            }

            lock ( m_displayChangeQueueLock )
            {
                /*replace any existing brightness change, or create a new one*/
                bool replaced = false;
                for (int i = 0; i < m_displayChangeQueue.Count; i++)
                {
                    if (m_displayChangeQueue[i].Type == DisplayChangeType.Brightness && m_displayChangeQueue[i].TargetDisplay == null)
                    {
                        m_displayChangeQueue[i] = new BrightnessDisplayChange(null, brightness);
                        replaced = true;
                    }
                }

                if (!replaced)
                {
                    m_displayChangeQueue.Add(new BrightnessDisplayChange(null, brightness));
                }
            }

            m_newDisplayChangeEvent.Set();
        }
Пример #2
0
        /// <summary>
        /// Queues a brightness change for a display. Only one brightness change can be processed at once so the change may not occur immediately
        /// </summary>
        /// <param name="display">display to set brightness of</param>
        /// <param name="brightness">new brightness value. value will be clamped to the display's mininum and maximum values</param>
        /// <returns></returns>
        public void SetAttachedDisplayBrightness(Display display, uint brightness)
        {
            if (display == null)
            {
                return;
            }

            if (display.IsValid == false)
            {
                System.Diagnostics.Debug.WriteLine("Tried to set brightness on invalid display!");
                return;
            }

            brightness = MathHelpers.ClampValue(brightness, display.MinBrightness, display.MaxBrightness);

            lock ( m_displayChangeQueueLock )
            {
                //if a brightness change is already queued for this display, replace it with this new one, otherwise queue up a new one
                bool replaced = false;
                for (int i = 0; i < m_displayChangeQueue.Count; i++)
                {
                    if (m_displayChangeQueue[i].TargetDisplay != null && m_displayChangeQueue[i].Type == DisplayChangeType.Brightness &&
                        m_displayChangeQueue[i].TargetDisplay.Handle.hPhysicalMonitor == display.Handle.hPhysicalMonitor)
                    {
                        m_displayChangeQueue[i] = new BrightnessDisplayChange(display, brightness);
                        replaced = true;
                    }
                }

                if (!replaced)
                {
                    m_displayChangeQueue.Add(new BrightnessDisplayChange(display, brightness));
                }
            }

            m_newDisplayChangeEvent.Set();
        }
Пример #3
0
        /// <summary>
        /// Async method responsible for applying queued changes to the displays
        /// </summary>
        private void _DisplayChangeApplicatorAsync()
        {
            DisplayChange displayChange;

            while (!m_shutdown)
            {
                m_newDisplayChangeEvent.WaitOne();

                if (m_shutdown)
                {
                    return;
                }

                while (m_displayChangeQueue.Count > 0)
                {
                    lock ( m_displayChangeQueueLock )
                    {
                        displayChange = m_displayChangeQueue.First();
                        m_displayChangeQueue.RemoveAt(0);
                    }

                    if (displayChange == null)
                    {
                        continue;
                    }

                    if (displayChange.Type == DisplayChangeType.Brightness)
                    {
                        BrightnessDisplayChange brightnessChange = displayChange as BrightnessDisplayChange;
                        if (brightnessChange == null)
                        {
                            continue;
                        }

                        if (brightnessChange.TargetDisplay != null)
                        {
                            //set brightness of attached display, if there is one
                            _SetDisplayBrightness(brightnessChange.TargetDisplay.Handle, brightnessChange.Brightness);
                        }
                        else
                        {
                            //set brightness of integrated displays, if supported
                            if (m_wmiBrightnessSetter != null)
                            {
                                try
                                {
                                    var wmiBrightnessParams = m_wmiBrightnessSetter.GetMethodParameters("WmiSetBrightness");
                                    wmiBrightnessParams["Brightness"] = brightnessChange.Brightness;
                                    wmiBrightnessParams["Timeout"]    = 0;
                                    m_wmiBrightnessSetter.InvokeMethod("WmiSetBrightness", wmiBrightnessParams, null);
                                }
                                catch (Exception e)
                                {
                                    System.Diagnostics.Debug.WriteLine("An integrated display appears to be present, but an error occured trying to set its brightness: " + e.Message);
                                }
                            }
                        }
                    }
                }
            }
        }