搜索
bottom↓
回复: 17

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

[复制链接]

出330入1880汤圆

发表于 2021-11-29 15:14:00 | 显示全部楼层 |阅读模式
偶然看到一个C++控制windows电脑背光亮度的代码,试了一下还挺好用,联想Y480,Win7下测试通过。

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

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

C++ laptop backlight control



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

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

powermain.cpp
  1. #include <windows.h>
  2. #include <stdio.h>
  3. #include <iostream>
  4. #include"backlit_lib.h"
  5. using namespace std;

  6. void bar(int val, int max)
  7. {

  8. }

  9. int main()
  10. {
  11.         int i=0;
  12.         int inc=2;

  13.         while(1)
  14.         {
  15.                 setbr(i);
  16.                 cerr<<"Lum="<<i<<"   \r";
  17.                 Sleep(10);
  18.                 i+=inc;
  19.                 if(i>100 || i==0) inc=-inc;
  20.         }
  21.         cerr<<"ok";
  22. }
复制代码


backlit_lib.h

  1. typedef struct _DISPLAY_BRIGHTNESS {
  2.     UCHAR ucDisplayPolicy;
  3.     UCHAR ucACBrightness;
  4.     UCHAR ucDCBrightness;
  5. } DISPLAY_BRIGHTNESS, *PDISPLAY_BRIGHTNESS;

  6. #define        DISPLAYPOLICY_AC        0x00000001
  7. #define        DISPLAYPOLICY_BOTH        0x00000002
  8. #define        DISPLAYPOLICY_DC        0x00000003
  9. #define IOCTL_VIDEO_QUERY_SUPPORTED_BRIGHTNESS CTL_CODE(FILE_DEVICE_VIDEO, 0x125, METHOD_BUFFERED, FILE_ANY_ACCESS)
  10. #define IOCTL_VIDEO_QUERY_DISPLAY_BRIGHTNESS CTL_CODE(FILE_DEVICE_VIDEO, 0x126, METHOD_BUFFERED, FILE_ANY_ACCESS)
  11. #define IOCTL_VIDEO_SET_DISPLAY_BRIGHTNESS CTL_CODE(FILE_DEVICE_VIDEO, 0x127, METHOD_BUFFERED, FILE_ANY_ACCESS)

  12. int setbr(int iBright)
  13. {
  14.     DWORD dwError;
  15.     HANDLE hDevice;
  16.     hDevice = CreateFile(L"\\\\.\\LCD",                                                        // accedi al LCD
  17.                 GENERIC_READ | GENERIC_WRITE,                        // modalità di accesso
  18.         FILE_SHARE_READ | FILE_SHARE_WRITE,                // modalità di condivisione
  19.         NULL,                                                                        // attributi di sicurezza di default
  20.         OPEN_EXISTING,                                                        // disposizione
  21.         0,                                                                                // attributi
  22.         NULL);

  23.     if (hDevice == INVALID_HANDLE_VALUE)
  24.     {
  25.         dwError = GetLastError();
  26.         printf("error(%d): CreateFile\n", dwError);
  27.         exit(-1);
  28.     }

  29.     DISPLAY_BRIGHTNESS displayBrightness;
  30.     DWORD  nOutBufferSize=sizeof(displayBrightness);
  31.     DWORD  nBytesReturned;

  32.     int nRes = DeviceIoControl(
  33.         (HANDLE) hDevice,                                                // handle del dispositivo
  34.         IOCTL_VIDEO_QUERY_DISPLAY_BRIGHTNESS,        // dwIoControlCode
  35.         NULL,                                                                        // lpInBuffer
  36.         0,                                                                                // nInBufferSize
  37.         &displayBrightness,                                                // output buffer
  38.         sizeof(displayBrightness),                                // dim out buffer
  39.         (LPDWORD) &nBytesReturned,                                // #bytes generati
  40.         NULL                                                                        // OVERLAPPED
  41.     );

  42.         DISPLAY_BRIGHTNESS *br = new DISPLAY_BRIGHTNESS;
  43.         br->ucACBrightness=iBright;
  44.         br->ucDCBrightness=iBright;
  45.         br->ucDisplayPolicy=0x00000002;

  46.         DeviceIoControl(
  47.                 (HANDLE) hDevice,
  48.                 IOCTL_VIDEO_SET_DISPLAY_BRIGHTNESS,
  49.                 (LPVOID) br,
  50.                 (DWORD) sizeof(LPVOID),
  51.                 NULL,
  52.                 0,
  53.                 (LPDWORD) &nBytesReturned,
  54.                 NULL
  55.         );

  56.     dwError = GetLastError();
  57.     CloseHandle(hDevice);
  58.     return 0;
  59. }
复制代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出30入16汤圆

发表于 2021-11-29 15:20:29 来自手机 | 显示全部楼层
这个代码的精华在哪里?

出0入8汤圆

发表于 2021-11-29 15:21:53 | 显示全部楼层
谢谢分享,win10 64位可用,就是变化太快,要和程序拼手速

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

出330入1880汤圆

 楼主| 发表于 2021-11-29 15:35:09 | 显示全部楼层
cc2666 发表于 2021-11-29 15:21
谢谢分享,win10 64位可用,就是变化太快,要和程序拼手速

ps. 笔记本双屏 ...

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

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

出20入186汤圆

发表于 2021-11-29 16:19:16 | 显示全部楼层
洞洞幺 发表于 2021-11-29 15:20
这个代码的精华在哪里?

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

出300入477汤圆

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

出330入1880汤圆

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

是这样

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

出200入2554汤圆

发表于 2021-11-29 18:17:01 | 显示全部楼层
黑窗口不圆润,上 MFC 盘他!

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

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



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



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出330入1880汤圆

 楼主| 发表于 2021-11-29 19:19:25 | 显示全部楼层
t3486784401 发表于 2021-11-29 18:17
黑窗口不圆润,上 MFC 盘他!

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

给力

这电位器图标

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

出0入0汤圆

发表于 2021-12-1 11:24:22 | 显示全部楼层
t3486784401 发表于 2021-11-29 18:17
黑窗口不圆润,上 MFC 盘他!

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

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

出200入2554汤圆

发表于 2021-12-1 13:11:11 | 显示全部楼层
duxingkei 发表于 2021-12-1 11:24
闪退,win7系统
应该不会是火绒干的吧

全是 WinAPI,目测是被干掉了

出330入1880汤圆

 楼主| 发表于 2022-1-7 17:07:43 | 显示全部楼层
t3486784401 发表于 2021-11-29 18:17
黑窗口不圆润,上 MFC 盘他!

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

从文件来看……

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

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

本想划划船,结果这是来了个货轮

出200入2554汤圆

发表于 2022-1-7 18:18:01 | 显示全部楼层
cne53102 发表于 2022-1-7 17:07
从文件来看……

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


是的,win10 下直接运行 vs2005

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

出330入1880汤圆

 楼主| 发表于 2022-1-7 19:19:42 | 显示全部楼层
t3486784401 发表于 2022-1-7 18:18
是的,win10 下直接运行 vs2005

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

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

出105入79汤圆

发表于 2022-1-8 00:53:41 | 显示全部楼层
t3486784401 发表于 2021-11-29 18:17
黑窗口不圆润,上 MFC 盘他!

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

好用,给力。

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

出20入67汤圆

发表于 2022-1-8 01:01:16 | 显示全部楼层
t3486784401 发表于 2021-11-29 18:17
黑窗口不圆润,上 MFC 盘他!

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

win7可用

出0入0汤圆

发表于 2022-1-8 15:38:52 | 显示全部楼层
内置显示器的笔记本专用的吧

出330入1880汤圆

 楼主| 发表于 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,只确认过文件大小。



编辑:修正描述

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-6 03:31

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表