2015-03-16 2 views
1

Следующий код Устанавливает цветовой фильтр экрана на определенный цвет.Получить цвет текущего цветного фильтра экрана

Как я могу вместо GET цвет экрана?

[DllImport("GDI32.dll")] 
private unsafe static extern bool SetDeviceGammaRamp(IntPtr hdc, void* ramp); 
private static IntPtr hdc; 

public unsafe bool SetLCDbrightness(Color c) 
{ 
    short red = c.R; 
    short green = c.G; 
    short blue = c.B; 

    Graphics gg = Graphics.FromHwnd(IntPtr.Zero); 
    hdc = gg.GetHdc(); 

    short* gArray = stackalloc short[3 * 256]; 
    short* idx = gArray; 
    short brightness = 0; 
    for (int j = 0; j < 3; j++) 
    { 
     if (j == 0) brightness = red; 
     if (j == 1) brightness = green; 
     if (j == 2) brightness = blue; 
     for (int i = 0; i < 256; i++) 
     { 
      int arrayVal = i * (brightness); 
      if (arrayVal > 65535) arrayVal = 65535; 
      *idx = (short)arrayVal; 
      idx++; 
     } 
    } 
    // For some reason, this always returns false? 
    bool retVal = SetDeviceGammaRamp(hdc, gArray); 
    gg.Dispose(); 
    return false; 
} 
+2

'GetDeviceGammaRamp'? См. [Правильное использование SetDeviceGammaRamp] (http://stackoverflow.com/questions/8359607/correct-usage-of-setdevicegammaramp) – bokibeg

ответ

1

Я приспособил этот other post, чтобы сформировать следующий ответ:

[DllImport("gdi32.dll")] 
public static extern int GetDeviceGammaRamp(IntPtr hDC, ref RAMP lpRamp); 
[DllImport("user32.dll")] 
public static extern IntPtr GetDC(IntPtr hWnd); 
[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; 
} 

private Color getScreenColor() 
{ 
    RAMP r = new RAMP(); 
    GetDeviceGammaRamp(GetDC(IntPtr.Zero), ref r); 
    return Color.FromArgb(r.Red[1], r.Green[1], r.Blue[1]); 
}