qt通过调节伽马值来调节显示器亮度

代码是参考的别人 来源博客的,自己做了一点改动

头文件

cpp 复制代码
#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

源文件

cpp 复制代码
#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;
        }
    }
}

界面源文件

cpp 复制代码
#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改变显示器亮度

相关推荐
小蒜学长3 小时前
校园社团招新网站的设计与实现(代码+数据库+LW)
java·数据库·spring boot·后端·校园社团招新网站
实心儿儿4 小时前
Qt — 音视频文件
qt·音视频
布莱克6054 小时前
MySQL 增删改查(CRUD)语法详解
数据库·mysql·增删改查
Dovis(誓平步青云)4 小时前
几个方案来回选不定?做一个随时切换的候选推荐页
android·java·服务器·开发语言·javascript·数据库·智能化
2501_933670795 小时前
2027届大数据管理与应用求职数字化转型顾问:项目、SQL、业务理解怎么排优先级
数据库·sql
东方护航数据恢复(深圳)5 小时前
物流案例:勒索病毒 Mallox 加密 ERP 数据库,旧备份 + 残留页重组实录【东方护航数据恢复深圳店】
数据库·数据恢复·勒索病毒·二次开盘·开盘·数据镜像
.Hypocritical.6 小时前
Redis从入门到实战:核心原理、场景落地与避坑指南
数据库·redis·缓存
李游Leo6 小时前
HarmonyOS 7 ArkUI + Window Kit:折叠屏编辑页的键盘避让快照与焦点恢复时序【鸿蒙心迹】
华为·计算机外设·harmonyos
梦想画家6 小时前
SQLMesh Python 模型入门(二):依赖管理、引擎实战与内存优化
数据库·python·sqlmesh
Omics Pro6 小时前
经典多组学整合算法→商用云平台
数据库·人工智能·算法·机器学习·自然语言处理