qt通过调节伽马值来调节显示器亮度
代码是参考的别人 来源博客的,自己做了一点改动
头文件
#ifndef CGAMARAMP_H
#define CGAMARAMP_H
#include <windows.h>
class CGamaRamp
{
public:
CGamaRamp();
~CGamaRamp();
protected:
HMODULE hGDI32;
HDC hScreenDC;
typedef BOOL (WINAPI *Type_SetDeviceGammaRamp)(HDC hDC, LPVOID lpRamp);
Type_SetDeviceGammaRamp pGetDeviceGammaRamp;
Type_SetDeviceGammaRamp pSetDeviceGammaRamp;
public:
BOOL LoadLibrary();
void FreeLibrary();
BOOL LoadLibraryIfNeeded();
BOOL SetDeviceGammaRamp(HDC hDC, LPVOID lpRamp);
BOOL GetDeviceGammaRamp(HDC hDC, LPVOID lpRamp);
BOOL SetBrightness(HDC hDC, WORD wBrightness);
int getGammaValue();
};
#endif // CGAMARAMP_H
源文件
#include "cgamaramp.h"
CGamaRamp::CGamaRamp()
{
//Initialize all variables.
hGDI32 = NULL;
hScreenDC = NULL;
pGetDeviceGammaRamp = NULL;
pSetDeviceGammaRamp = NULL;
}
CGamaRamp::~CGamaRamp()
{
FreeLibrary();
}
BOOL CGamaRamp::LoadLibrary()
{
BOOL bReturn = FALSE;
FreeLibrary();
//Load the GDI library.
hGDI32 = ::LoadLibrary(TEXT("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 CGamaRamp::FreeLibrary()
{
//Free the GDI library.
if (hGDI32 != NULL)
{
::FreeLibrary(hGDI32);
hGDI32 = NULL;
}
}
BOOL CGamaRamp::LoadLibraryIfNeeded()
{
BOOL bReturn = FALSE;
if (hGDI32 == NULL)
LoadLibrary();
if (pGetDeviceGammaRamp != NULL && pSetDeviceGammaRamp != NULL)
bReturn = TRUE;
return bReturn;
}
BOOL CGamaRamp::SetDeviceGammaRamp(HDC hDC, LPVOID lpRamp)
{
//Call to SetDeviceGammaRamp only if this function is successfully loaded.
if (hGDI32!= NULL)
{
return pSetDeviceGammaRamp(hDC, lpRamp);
}
else
return FALSE;
}
BOOL CGamaRamp::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 CGamaRamp::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;
}
int CGamaRamp::getGammaValue()
{
// 获取默认显示器的设备上下文
HDC hdc = GetDC(NULL);
if (hdc)
{
// 存储伽马曲线
WORD gammaRamp[256][3]; // 256 个级别,每个级别有 R、G 和 B 分量
// 获取当前的伽马 Ramp
if (GetDeviceGammaRamp(hdc, gammaRamp))
{
// 输出伽马值
for (int i = 0; i < 256; i++)
{
if(i==255)
{
return gammaRamp[i][2] /255 -128;
}
}
}
else
{
return -1;
}
}
}
界面源文件
#include "widget.h"
#include "ui_widget.h"
#include <Windows.h>
#include<QDebug>
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
ui->horizontalSlider->setRange(1, 255);
QObject::connect(ui->horizontalSlider,SIGNAL(valueChanged(int)),this,SLOT(onSpinValueChanged(int)));
setWindowTitle(tr("屏幕亮度工具"));
hDC = GetDC(NULL);
GammaRamp.LoadLibraryIfNeeded();
int value = GammaRamp.getGammaValue();
ui->horizontalSlider->setValue(value);
}
Widget::~Widget()
{
delete ui;
}
void Widget::onSpinValueChanged(int i)
{
ui->label_2->setText(QString::number(i));
int gamma = i;
GammaRamp.SetBrightness(hDC, gamma);
}
总结找个方法其实不是很好用,对于有的显示器,会被自动校准回去。如果想通过其它方式实现调节显示器亮度参见我的文章使用WMI改变显示器亮度