2017-02-11 3 views
0

私は自分でC#で目を覚ますプログラムを作ろうとしていましたが、多少の作業の後に画面を暗くすることになっていました。画面の明るさを変更するには、SetDeviceGammaRampメソッドを使用するこの記事(https://www.codeproject.com/Articles/47355/Setting-Screen-Brightness-in-C)を続けました。SetDeviceGammaRampは画面をちょうど点滅させます。

private unsafe void dimScreen() 
    { 
     var brightness = 10; 

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

     SetDeviceGammaRamp(hdc, gArray); 
     Thread.Sleep(10000); 
    } 

しかし、代わりに永久的に明るさを変更する(または少なくとも10秒間)画面がちょうど半分秒間点滅:私のコードは、以下です。 SetDeviceGammaRampをスリープ状態で数回呼び出すと状況が変わることはありません。私が得るのは数回の点滅だけです。輝度変数を変更すると、その点滅の明るさも変わるので、hdcとgArray変数が正しく割り当てられていると仮定します。私は他のソリューションを探してみましたが、そのほとんどがこの方法を使用していて、誰もこの問題を抱えていないようです。問題が何であるかについてのアイデアは?

UPD:問題は全面的に流れていたようです。ガンマの変化に気づき、以前の値にリセットします。

+0

ルックを、ビデオドライバがクラッシュしたことを、いくつかのオッズと自動回復が点滅アーティファクトを生成します。別のマシンを試してください。これは画面の明るさを調整するための非常に良い方法ではないことに注意してください。安全なログインデスクトップは影響を受けません。残念なことに、コードで輝度を確実に制御することは難しい目標です.VESAモニタインタフェース規格はあまり良くありません。 –

答えて

0

ここでは、画面の明るさを設定できるC#のコードを示します。試してみることができます。

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

実際には、コードにエラーはありません。このdimScreen()の機能はどのように使用しますか?たぶんあなたは適切でないロジックでこれを行うでしょう。私はここに写真付きのチュートリアル見つけ

:Windowsイベントログにhttp://www.lattepanda.com/topic-f11t3020.html

関連する問題