2011-11-19 85 views
7

我想通過我自己調整屏幕亮度。因爲Windows讓我只能在有限的範圍內進行調整。我想讓顯示器從0到100%變暗並將其關閉/打開。它應該是可能的,如果它可以自動執行(Dim display after:x minutes /關閉顯示:x分鐘後)。我嘗試了一些我通過google找到的來源和類。但他們中沒有一個能起作用C#設置屏幕亮度Windows 7

你有沒有試過這個,或者你能推薦我任何工作代碼?

感謝您的回覆。

回答

15

可以使用WmiSetBrightness方法:

using System.Management; 
//... 
static void SetBrightness(byte targetBrightness) { 
    ManagementScope scope = new ManagementScope("root\\WMI"); 
    SelectQuery query = new SelectQuery("WmiMonitorBrightnessMethods"); 
    using(ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query)) { 
     using(ManagementObjectCollection objectCollection = searcher.Get()) { 
      foreach(ManagementObject mObj in objectCollection) { 
       mObj.InvokeMethod("WmiSetBrightness", 
        new Object[] { UInt32.MaxValue, targetBrightness }); 
       break; 
      } 
     } 
    } 
} 

欲瞭解更多詳情,請看一看Brightness Control in WDDMMonitor Configuration Functions

3

嘗試這樣的:

using System; 
using System.ComponentModel; 
using System.Runtime.InteropServices; 

namespace MediaManagerSql.DataAccess.Sql.EntityFramework 
{ 
    public class ScreenBrightness : Component 
    { 
     private int _gammaValue; 
     private RAMP _ramp; 

     public ScreenBrightness() 
     { 
      InitializeComponent(); 
     } 

     public ScreenBrightness(IContainer container) 
     { 
      container.Add(this); 
      InitializeComponent(); 
     } 

     [Description("Brightness Gamma Value")] 
     [Category("Brightness")] 
     public int SetGammaValue 
     { 
      get { return _gammaValue; } 
      set { _gammaValue = value; } 
     } 

     [DllImport("gdi32.dll")] 
     public static extern bool SetDeviceGammaRamp(IntPtr hDC, ref RAMP lpRamp); 
     [DllImport("user32.dll")] 
     private static extern IntPtr GetDC(IntPtr hWnd); 

     /// <summary> 
     /// Apply the selected gamma value to screen 
     /// </summary> 
     public void ApplyGamma() 
     { 
      // since gamma value is max 44 ,, we need to take the percentage from this because 
      // it needed from 0 - 100% 
      double gValue = _gammaValue; 
      gValue = Math.Floor(Convert.ToDouble((gValue/2.27))); 

      _gammaValue = Convert.ToInt16(gValue); 

      if (_gammaValue != 0) 
      { 
       _ramp.Red = new ushort[256]; 
       _ramp.Green = new ushort[256]; 
       _ramp.Blue = new ushort[256]; 

       for (int i = 1; i < 256; i++) 
       { 
        // gamma is a value between 3 and 44 
        _ramp.Red[i] = 
         _ramp.Green[i] = 
         _ramp.Blue[i] = 
         (ushort) 
         (Math.Min(65535, Math.Max(0, Math.Pow((i + 1)/256.0, (_gammaValue + 5)*0.1)*65535 + 0.5))); 
       } 

       SetDeviceGammaRamp(GetDC(IntPtr.Zero), ref _ramp); 
      } 
     } 

     #region Nested type: RAMP 

     [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)] 
     public struct RAMP 
     { 
      [MarshalAs(UnmanagedType.ByValArray, SizeConst = 256)] public UInt16[] Red; 
      [MarshalAs(UnmanagedType.ByValArray, SizeConst = 256)] public UInt16[] Green; 
      [MarshalAs(UnmanagedType.ByValArray, SizeConst = 256)] public UInt16[] Blue; 
     } 
     #endregion 
    } 
} 
+0

它只在一些PC上工作。它正在改變伽馬值,但我想要改變亮度值。像在Windows中 - >調整屏幕亮度(顯示器背光)。 – sczdavos

+0

如何在win服務應用程序中使用這種方法? – Butsaty

0

使用微軟的API調整屏幕亮度。調用SetDeviceGammaRamp函數。

試試看看這個代碼。

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows.Forms; 
using System.Runtime.InteropServices; 
namespace brightnesscontrol 
{ 
    public partial class Form1 : Form 
    { 
     [DllImport("gdi32.dll")] 
     private unsafe static extern bool SetDeviceGammaRamp(Int32 hdc, void* ramp); 
     private static bool initialized = false; 
     private static Int32 hdc; 
     private static int a; 
     public Form1() 
     { 
      InitializeComponent(); 
     } 
     private static void InitializeClass() 
     { 
      if (initialized) 
       return; 
      hdc = Graphics.FromHwnd(IntPtr.Zero).GetHdc().ToInt32(); 
      initialized = true; 
     } 
     public static unsafe bool SetBrightness(int brightness) 
     { 
      InitializeClass(); 
      if (brightness > 255) 
       brightness = 255; 
      if (brightness < 0) 
       brightness = 0; 
      short* gArray = stackalloc short[3 * 256]; 
      short* idx = gArray; 
      for (int j = 0; j < 3; j++) 
      { 
       for (int i = 0; i < 256; i++) 
       { 
        int arrayVal = i * (brightness + 128); 
        if (arrayVal > 65535) 
         arrayVal = 65535; 
        *idx = (short)arrayVal; 
        idx++; 
       } 
      } 
      bool retVal = SetDeviceGammaRamp(hdc, gArray); 
      return retVal; 
     } 
     private void trackBar1_Scroll(object sender, EventArgs e) 
     { 
     } 
     private void button1_Click(object sender, EventArgs e) 
     { 
      a = trackBar1.Value; 
      SetBrightness(a); 
     } 
    } 
} 

創建窗體窗體應用程序並拖動一個按鈕和一個軌跡條。

您可以在這裏看到教程:http://www.lattepanda.com/topic-f11t3020.html