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(); }
/// <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(); }
/// <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); } } } } } } }