有些显卡允许你通过程序修改其自身伽玛矫正值,因此你可以使用此特点来改变整个屏幕的亮度。
该SetDeviceGammaRamp API函数接受256个RGB值的数组,在这个数组增加值会让你的屏幕更亮。
并减少这些值将会使你的屏幕变暗。您也可以增加或减少红/绿/蓝分量值。例如:增加蓝色成分在所有的RGB值将增加
更多的蓝色到整个画面。下面的类封装了调用GetDeviceGammaRamp和SetDeviceGammaRamp,并提供SetBrightness函数
用于设置屏幕的亮度。
Class header file: (gammaramp.h)
#ifndef GAMMARAMP_H_
#define GAMMARAMP_H_
/*
CGammaRamp class
Encapsulates the Gamma Ramp API and changes the brightness of
the entire screen.
*/
class CGammaRamp
{
protected:
HMODULE hGDI32;
HDC hScreenDC;
typedef BOOL (WINAPI *Type_SetDeviceGammaRamp)(HDC hDC, LPVOID lpRamp);
Type_SetDeviceGammaRamp pGetDeviceGammaRamp;
Type_SetDeviceGammaRamp pSetDeviceGammaRamp;
public:
CGammaRamp();
~CGammaRamp();
BOOL LoadLibrary();
void FreeLibrary();
BOOL LoadLibraryIfNeeded();
BOOL SetDeviceGammaRamp(HDC hDC, LPVOID lpRamp);
BOOL GetDeviceGammaRamp(HDC hDC, LPVOID lpRamp);
BOOL SetBrightness(HDC hDC, WORD wBrightness);
};
#endif
Class C++ File: (gammaramp.cpp)
#include <windows.h>
#include "gammaramp.h"
/*
CGammaRamp class
Encapsulates the Gamma Ramp API and changes the brightness of
the entire screen.
*/
CGammaRamp::CGammaRamp()
{
//Initialize all variables.
hGDI32 = NULL;
hScreenDC = NULL;
pGetDeviceGammaRamp = NULL;
pSetDeviceGammaRamp = NULL;
}
CGammaRamp::~CGammaRamp()
{
FreeLibrary();
}
BOOL CGammaRamp::LoadLibrary()
{
BOOL bReturn = FALSE;
FreeLibrary();
//Load the GDI library.
hGDI32 = ::LoadLibrary("gdi32.dll");
if (hGDI32 != NULL)
{
//Get the addresses of GetDeviceGammaRamp and SetDeviceGammaRamp API functions.
pGetDeviceGammaRamp =
(Type_SetDeviceGammaRamp)GetProcAddress(hGDI32, "GetDeviceGammaRamp");
pSetDeviceGammaRamp =
(Type_SetDeviceGammaRamp)GetProcAddress(hGDI32, "SetDeviceGammaRamp");
//Return TRUE only if these functions exist.
if (pGetDeviceGammaRamp == NULL || pSetDeviceGammaRamp == NULL)
FreeLibrary();
else
bReturn = TRUE;
}
return bReturn;
}
void CGammaRamp::FreeLibrary()
{
//Free the GDI library.
if (hGDI32 != NULL)
{
::FreeLibrary(hGDI32);
hGDI32 = NULL;
}
}
BOOL CGammaRamp::LoadLibraryIfNeeded()
{
BOOL bReturn = FALSE;
if (hGDI32 == NULL)
LoadLibrary();
if (pGetDeviceGammaRamp != NULL && pSetDeviceGammaRamp != NULL)
bReturn = TRUE;
return bReturn;
}
BOOL CGammaRamp::SetDeviceGammaRamp(HDC hDC, LPVOID lpRamp)
{
//Call to SetDeviceGammaRamp only if this function is successfully loaded.
if (LoadLibraryIfNeeded())
{
return pSetDeviceGammaRamp(hDC, lpRamp);
}
else
return FALSE;
}
BOOL CGammaRamp::GetDeviceGammaRamp(HDC hDC, LPVOID lpRamp)
{
//Call to GetDeviceGammaRamp only if this function is successfully loaded.
if (LoadLibraryIfNeeded())
{
return pGetDeviceGammaRamp(hDC, lpRamp);
}
else
return FALSE;
}
BOOL CGammaRamp::SetBrightness(HDC hDC, WORD wBrightness)
{
/*
Changes the brightness of the entire screen.
This function may not work properly in some video cards.
The wBrightness value should be a number between 0 and 255.
128 = Regular brightness
above 128 = brighter
below 128 = darker
If hDC is NULL, SetBrightness automatically load and release
the display device context for you.
*/
BOOL bReturn = FALSE;
HDC hGammaDC = hDC;
//Load the display device context of the entire screen if hDC is NULL.
if (hDC == NULL)
hGammaDC = GetDC(NULL);
if (hGammaDC != NULL)
{
//Generate the 256-colors array for the specified wBrightness value.
WORD GammaArray[3][256];
for (int iIndex = 0; iIndex < 256; iIndex++)
{
int iArrayValue = iIndex * (wBrightness + 128);
if (iArrayValue > 65535)
iArrayValue = 65535;
GammaArray[0][iIndex] =
GammaArray[1][iIndex] =
GammaArray[2][iIndex] = (WORD)iArrayValue;
}
//Set the GammaArray values into the display device context.
bReturn = SetDeviceGammaRamp(hGammaDC, GammaArray);
}
if (hDC == NULL)
ReleaseDC(NULL, hGammaDC);
return bReturn;
}
Example for using the CGammaRamp class:
#include <windows.h>
#include "gammaramp.h"
int WINAPI WinMain(
HINSTANCE hInstance, // handle to current instance
HINSTANCE hPrevInstance, // handle to previous instance
LPSTR lpCmdLine, // command line
int nCmdShow // show state
)
{
//Example for changing the brightness with CGammaRamp class:
//Be aware that this exmaple may not work properly in all
//Video cards.
CGammaRamp GammaRamp;
//Make the screen darker:
GammaRamp.SetBrightness(NULL, 64);
//Wait 3 seconds:
Sleep(3000);
//Return back to normal:
GammaRamp.SetBrightness(NULL, 128);
return 0;
}