using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Runtime.InteropServices; // 必须引用此项 // 警告:实验此代码可能给你的显示器的显示带来问题 ,花了两个小时查API的用法 // 不过我试过是没有事情的(BS下自己:不是用自己的机子) namespace WindowsApplication1 ... { public partial class Form1 : Form ...{ public Form1() ...{ InitializeComponent(); } private void button1_Click(object sender, EventArgs e) ...{ SetGamma(trackBar1.Value); } [DllImport("gdi32.dll")] public static extern int GetDeviceGammaRamp(IntPtr hDC, ref RAMP lpRamp); RAMP ramp = new RAMP(); [DllImport("gdi32.dll")] public static extern int SetDeviceGammaRamp(IntPtr hDC, ref RAMP lpRamp); [DllImport("user32.dll")] 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; } void SetGamma(int gamma) ...{ ramp.Red = new ushort[256]; ramp.Green = new ushort[256]; ramp.Blue = new ushort[256]; for (int i = 1; i < 256; i++) ...{ // gamma 必须在3和44之间 ramp.Red[i] = ramp.Green[i] = ramp.Blue[i] = (ushort)(Math.Min(65535, Math.Max(0, Math.Pow((i + 1) / 256.0, gamma * 0.1) * 65535 + 0.5))); } SetDeviceGammaRamp(GetDC(IntPtr.Zero), ref ramp); } }}