Autor Beitrag
norman2306
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 222
Erhaltene Danke: 16

Win XP, Win 7 64-Bit
C# 4.0 (VS2010)
BeitragVerfasst: Mo 30.05.11 16:33 
Servus!

Weiß jemand ob die Microhirne 'WMIMonitorBrightness' wieder entfernt haben unter Windows 7? Ich möchte gerne die Helligkeit eines Gerätes entsprechend den Werten eines Lichtsensors anpassen. Unter XP ging das so:

ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
public const uint IOCTL_VIDEO_SET_DISPLAY_BRIGHTNESS = 0x23049C;


[DllImport("user32.dll")]
public static extern bool EnumDisplayDevices(string lpDevice, uint iDevNum, ref DisplayDevice lpDisplayDevice, uint dwFlags);


public static List<DisplayDevice> GetDisplayDevices()
{
    var res = new List<DisplayDevice>();
    var d = new DisplayDevice();
    try
    {
        for (uint id = 0; HardwareControler.EnumDisplayDevices(null, id, ref d, 0); id++)
        {
           d.cb = Marshal.SizeOf(d);
           res.Add(d);
        }
     }
     catch (Exception ex)
     {
         Console.WriteLine(String.Format("{0}", ex.ToString()));
     }

     return res;
}


public static void SetBrightness(int value)
{
    var dis = GetDisplayDevices();

    foreach (var display in dis)
    {
       try
       {
          //Permission-Exception (Win32 Fehler 5) unter Vista und Win7
          var file = FileInfo32.OpenFile(display.DeviceName);
          
          var setts = new DisplayBrigthness();
          setts.ucACBrightness = (uint)value;
          setts.ucDCBrightness = (uint)value;
          GCHandle handle = GCHandle.Alloc(setts, GCHandleType.Pinned);
          var p = handle.AddrOfPinnedObject();

          uint r = 0;
          bool res = DeviceIoControl(file, IOCTL_VIDEO_SET_DISPLAY_BRIGHTNESS, p, (uint)Marshal.SizeOf(setts), IntPtr.Zero, 0ref r, IntPtr.Zero);
        }
        catch
        { }
    }
}


Unter Vista konnte man sich mit WMI behelfen:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
        public static void SetBrightness(byte value)
        {
            //Namespace holen
            System.Management.ManagementScope s = new System.Management.ManagementScope("root\\WMI");

            //Query definieren
            System.Management.SelectQuery q = new System.Management.SelectQuery("WmiMonitorBrightness");
            System.Management.ManagementObjectSearcher mos = new System.Management.ManagementObjectSearcher(s, q);

            //Objecte filtern
            System.Management.ManagementObjectCollection moc = mos.Get();


            //hier Fehler unter Win7 : 'Nicht unterstützt'
            foreach (System.Management.ManagementObject o in moc)
            {
                    o.SetPropertyValue("CurrentBrightness", value);
                    break//only work on the first object 
            }

            moc.Dispose();
            mos.Dispose();

            
        }


Und wie gejt es unter Win 7? Da funktioniert nämlich beides nicht...