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

相关推荐
wkd_0073 分钟前
【Qt | QLineEdit】Qt 中使 QLineEdit 响应 鼠标单击、双击事件 的两个方法
qt·qlineedit·鼠标双击·鼠标单击
培林将军7 分钟前
C51单片机-单按键输入识别,键盘消抖
单片机·嵌入式硬件·计算机外设
罗小爬EX22 分钟前
MySql批量迁移数据库
数据库·mysql
言成言成啊22 分钟前
PostgreSQL维护——解决索引膨胀和数据死行
数据库·postgresql
WZF-Sang23 分钟前
【MySQL】数据类型【mysql当中各自经典的数据类型的学习和使用】
linux·数据库·sql·学习·mysql·adb
挠背小能手23 分钟前
达梦DIsql使用方法
数据库
迷茫运维路27 分钟前
mysql5.7常用操作命令手册
运维·数据库
玖石书1 小时前
etcd 集群搭建与测试指南
数据库·etcd·集群
南叔先生1 小时前
Linux 性能优化 copy
网络·数据库·php
好记忆不如烂笔头abc1 小时前
统计信息的导出导入
数据库