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

相关推荐
l1t1 小时前
利用DeepSeek优化SQLite求解数独SQL用于DuckDB
开发语言·数据库·sql·sqlite·duckdb
lcanfly1 小时前
Mysql作业5
android·数据库·mysql
rit84324991 小时前
在Ubuntu上配置Nginx实现开机自启功能
数据库·nginx·ubuntu
硅农深芯1 小时前
如何使用ptqt5实现进度条的动态显示
开发语言·python·qt
海绵啵啵呀2 小时前
SQL plus中解决上下键找历史命令的工具--rlwrap命令行工具
数据库·sql
Lhan.zzZ2 小时前
Qt数据可视化实战:饼图、线图与表格的完整指南
开发语言·qt·信息可视化
Elastic 中国社区官方博客2 小时前
使用 Mastra 和 Elasticsearch 构建具有语义回忆功能的知识 agent
大数据·数据库·人工智能·elasticsearch·搜索引擎·ai·全文检索
老邓计算机毕设2 小时前
SSM危险品运输车辆信息管理系统b2z1o(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
数据库·ssm 框架
Xxtaoaooo2 小时前
从普通屏到 明基RD320U:一台显示器如何提升我的编码效率?
计算机外设·专业工具·明基rd320u·专业编程显示器·提效工具
MuYiLuck2 小时前
redis持久化与集群
java·数据库·redis