cne53102 发表于 2021-11-29 15:14:00

[转]偶然看到一个C++控制电脑背光亮度的代码

偶然看到一个C++控制windows电脑背光亮度的代码,试了一下还挺好用,联想Y480,Win7下测试通过。

作者应该是叫Diglo,看语言应该是个意大利人。

作者发布该代码的网址:http://diglo.altervista.org/blog/?p=70

C++ laptop backlight control



代码不长挺简单的,还真没想过可以自己写代码控制背光,我还以为只能靠厂家的软件呢,Y480的背光可调级数很少,这个软件的效果比Y480驱动带的背光控制效果好不少。

只有2个文件,直接把代码贴出来吧:

powermain.cpp
#include <windows.h>
#include <stdio.h>
#include <iostream>
#include"backlit_lib.h"
using namespace std;

void bar(int val, int max)
{

}

int main()
{
        int i=0;
        int inc=2;

        while(1)
        {
                setbr(i);
                cerr<<"Lum="<<i<<"   \r";
                Sleep(10);
                i+=inc;
                if(i>100 || i==0) inc=-inc;
        }
        cerr<<"ok";
}

backlit_lib.h

typedef struct _DISPLAY_BRIGHTNESS {
    UCHAR ucDisplayPolicy;
    UCHAR ucACBrightness;
    UCHAR ucDCBrightness;
} DISPLAY_BRIGHTNESS, *PDISPLAY_BRIGHTNESS;

#define        DISPLAYPOLICY_AC        0x00000001
#define        DISPLAYPOLICY_BOTH        0x00000002
#define        DISPLAYPOLICY_DC        0x00000003
#define IOCTL_VIDEO_QUERY_SUPPORTED_BRIGHTNESS CTL_CODE(FILE_DEVICE_VIDEO, 0x125, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_VIDEO_QUERY_DISPLAY_BRIGHTNESS CTL_CODE(FILE_DEVICE_VIDEO, 0x126, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_VIDEO_SET_DISPLAY_BRIGHTNESS CTL_CODE(FILE_DEVICE_VIDEO, 0x127, METHOD_BUFFERED, FILE_ANY_ACCESS)

int setbr(int iBright)
{
    DWORD dwError;
    HANDLE hDevice;
    hDevice = CreateFile(L"\\\\.\\LCD",                                                        // accedi al LCD
                GENERIC_READ | GENERIC_WRITE,                        // modalità di accesso
      FILE_SHARE_READ | FILE_SHARE_WRITE,                // modalità di condivisione
      NULL,                                                                        // attributi di sicurezza di default
      OPEN_EXISTING,                                                        // disposizione
      0,                                                                                // attributi
      NULL);

    if (hDevice == INVALID_HANDLE_VALUE)
    {
      dwError = GetLastError();
      printf("error(%d): CreateFile\n", dwError);
      exit(-1);
    }

    DISPLAY_BRIGHTNESS displayBrightness;
    DWORDnOutBufferSize=sizeof(displayBrightness);
    DWORDnBytesReturned;

    int nRes = DeviceIoControl(
      (HANDLE) hDevice,                                                // handle del dispositivo
      IOCTL_VIDEO_QUERY_DISPLAY_BRIGHTNESS,        // dwIoControlCode
      NULL,                                                                        // lpInBuffer
      0,                                                                                // nInBufferSize
      &displayBrightness,                                                // output buffer
      sizeof(displayBrightness),                                // dim out buffer
      (LPDWORD) &nBytesReturned,                                // #bytes generati
      NULL                                                                        // OVERLAPPED
    );

        DISPLAY_BRIGHTNESS *br = new DISPLAY_BRIGHTNESS;
        br->ucACBrightness=iBright;
        br->ucDCBrightness=iBright;
        br->ucDisplayPolicy=0x00000002;

        DeviceIoControl(
                (HANDLE) hDevice,
                IOCTL_VIDEO_SET_DISPLAY_BRIGHTNESS,
                (LPVOID) br,
                (DWORD) sizeof(LPVOID),
                NULL,
                0,
                (LPDWORD) &nBytesReturned,
                NULL
        );

    dwError = GetLastError();
    CloseHandle(hDevice);
    return 0;
}

洞洞幺 发表于 2021-11-29 15:20:29

这个代码的精华在哪里?

cc2666 发表于 2021-11-29 15:21:53

谢谢分享,win10 64位可用,就是变化太快,要和程序拼手速{:titter:}{:titter:}{:titter:}

ps. 笔记本双屏扩展显示只能控制内置屏,不能控制外屏

cne53102 发表于 2021-11-29 15:35:09

cc2666 发表于 2021-11-29 15:21
谢谢分享,win10 64位可用,就是变化太快,要和程序拼手速

ps. 笔记本双屏 ...

2010年的代码win10也可用是个好消息

win7下看速度也挺快的,看来main里的sleep要改大点再试{:titter:}

yuyu87 发表于 2021-11-29 16:19:16

洞洞幺 发表于 2021-11-29 15:20
这个代码的精华在哪里?

CreateFile(L"\\\\.\\LCD",
就这一句了

redroof 发表于 2021-11-29 17:09:56

其实,原则上厂家软件能干的所有事情,你自己写程序都能干。
只要你知道接口就行。
厂家自己的控制软件也是个普通程序啊。
控制背光看起来应该是个标准的操作,数据结构都有。
其实即使是厂家自己专有的某种操作,最终也还是基本上都调用到了DeviceIoControl,只不过发出的控制码是它自己厂家专有的而已。它自己的驱动会认得,别人的驱动不认。
应用程序跟驱动程序执行特殊操作的标准接口就是DeviceIoControl,做驱动程序的人愿意定义任何控制码都行。只要你知道含义,你也能调用。

cne53102 发表于 2021-11-29 17:29:40

redroof 发表于 2021-11-29 17:09
其实,原则上厂家软件能干的所有事情,你自己写程序都能干。
只要你知道接口就行。
厂家自己的控制软件也是 ...

是这样

但还真没想过自己实现这个功能,一直认为厂家这部分是封闭不公开没法搞的,也没有去查过什么。。

t3486784401 发表于 2021-11-29 18:17:01

黑窗口不圆润,上 MFC 盘他!

加个拖动条,拷贝几个 ntddvdeo.h 宏定义,总算编译通过(含可执行文件):

运行效果(XP~Win10兼容):



1L 位置的 exe 居然直接被 Win10 防护掉,目测是 DeviceIoControl 劲太大上头了。附上 virscan.org 扫描结果:



cne53102 发表于 2021-11-29 19:19:25

t3486784401 发表于 2021-11-29 18:17
黑窗口不圆润,上 MFC 盘他!

加个拖动条,拷贝几个 ntddvdeo.h 宏定义,总算编译通过(含可执行文件):


给力

这电位器图标{:biggrin:}

我没有尝试重新编译对比,但那个exe火绒没有报毒,应该是劲太大误杀的,用记事本查看里面绑着一个Microsoft.VC90.CRT,不知是不是因为这个

duxingkei 发表于 2021-12-1 11:24:22

t3486784401 发表于 2021-11-29 18:17
黑窗口不圆润,上 MFC 盘他!

加个拖动条,拷贝几个 ntddvdeo.h 宏定义,总算编译通过(含可执行文件):


闪退,win7系统
应该不会是火绒干的吧

t3486784401 发表于 2021-12-1 13:11:11

duxingkei 发表于 2021-12-1 11:24
闪退,win7系统
应该不会是火绒干的吧

全是 WinAPI,目测是被干掉了

cne53102 发表于 2022-1-7 17:07:43

t3486784401 发表于 2021-11-29 18:17
黑窗口不圆润,上 MFC 盘他!

加个拖动条,拷贝几个 ntddvdeo.h 宏定义,总算编译通过(含可执行文件):


从文件来看……

请问你是在win10上用的visual studio 2005吗?怎么样?

我今天下了个2022的,诶哟,难受死了,硬盘剩余空间的百位数都掉了个字{:mad:}

本想划划船,结果这是来了个货轮{:sweat:}

t3486784401 发表于 2022-1-7 18:18:01

cne53102 发表于 2022-1-7 17:07
从文件来看……

请问你是在win10上用的visual studio 2005吗?怎么样?


是的,win10 下直接运行 vs2005

很爽啊,编译正常,坛子里的工具都是这玩意编译的

cne53102 发表于 2022-1-7 19:19:42

t3486784401 发表于 2022-1-7 18:18
是的,win10 下直接运行 vs2005

很爽啊,编译正常,坛子里的工具都是这玩意编译的 ...

好,我换2005,这个2022的难受的不行

qwe2231695 发表于 2022-1-8 00:53:41

t3486784401 发表于 2021-11-29 18:17
黑窗口不圆润,上 MFC 盘他!

加个拖动条,拷贝几个 ntddvdeo.h 宏定义,总算编译通过(含可执行文件):


好用,给力。

比笔记本自带的好用,可以百分之一调节。

autolog 发表于 2022-1-8 01:01:16

t3486784401 发表于 2021-11-29 18:17
黑窗口不圆润,上 MFC 盘他!

加个拖动条,拷贝几个 ntddvdeo.h 宏定义,总算编译通过(含可执行文件):


win7可用

mcu5i51 发表于 2022-1-8 15:38:52

内置显示器的笔记本专用的吧

cne53102 发表于 2022-1-8 16:47:24

本帖最后由 cne53102 于 2022-1-8 16:59 编辑

mcu5i51 发表于 2022-1-8 15:38
内置显示器的笔记本专用的吧

可能是的。

不过外接显示器也是可以实现的。

有一个叫ClickMonitorDDC的软件确确实实可以通过HDMI线控制我显示器。我没有测试过DP接口,可能也可以。不知道是如何实现的。

理论上VGA接口也有机会实现,因为VGA具有SDA和SCL,只是不知道哪些显示器真的具有那样的功能。



压缩包内是ClickMonitorDDC 7.2的便携版和安装版,我只测试过便携版。

ClickMonitorDDC的官网clickmonitorddc.bplaced.net已经挂了,便携版来自achive的备份,安装版来自softpedia,只确认过文件大小。



编辑:修正描述
页: [1]
查看完整版本: [转]偶然看到一个C++控制电脑背光亮度的代码