2011-11-19 31 views
7

Voglio solo una luminosità dello schermo da solo. Perché Windows mi consente solo la regolazione in un intervallo limitato. Voglio oscurare il display da 0 a 100% e spegnerlo/accenderlo. Dovrebbe essere possibile se Windows può farlo automaticamente (Dim display dopo: x minuti/Spegni display dopo: x minuti). Ho provato alcune fonti e classi che ho trovato su google. Ma nessuno di loro funziona.C# luminosità dello schermo di impostazione Windows 7

Hai mai provato questo o mi puoi consigliare qualche codice funzionante?

Grazie per le risposte.

risposta

15

È possibile utilizzare il metodo 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; 
      } 
     } 
    } 
} 

Per ulteriori informazioni, si prega di dare un'occhiata a Brightness Control in WDDM e Monitor Configuration Functions

3

provare in questo modo:

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

E 'solo lavorando su alcuni PC. E sta cambiando il valore di Gama, ma voglio cambiare il valore di luminosità. Come in Windows -> Regola la luminosità dello schermo (retroilluminazione del monitor). – sczdavos

+0

come usare questo metodo nell'app win service? – Butsaty

0

Utilizzare Microsoft API per regola la luminosità dello schermo. Chiama la funzione SetDeviceGammaRamp.

Prova questo codice.

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

Creare l'applicazione del modulo di Windows e trascinare un pulsante e una barra di scorrimento.

si può vedere il tutorial qui: http://www.lattepanda.com/topic-f11t3020.html

Problemi correlati