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改变显示器亮度

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值