[转]偶然看到一个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;
} 这个代码的精华在哪里? 谢谢分享,win10 64位可用,就是变化太快,要和程序拼手速{:titter:}{:titter:}{:titter:}
ps. 笔记本双屏扩展显示只能控制内置屏,不能控制外屏 cc2666 发表于 2021-11-29 15:21
谢谢分享,win10 64位可用,就是变化太快,要和程序拼手速
ps. 笔记本双屏 ...
2010年的代码win10也可用是个好消息
win7下看速度也挺快的,看来main里的sleep要改大点再试{:titter:} 洞洞幺 发表于 2021-11-29 15:20
这个代码的精华在哪里?
CreateFile(L"\\\\.\\LCD",
就这一句了 其实,原则上厂家软件能干的所有事情,你自己写程序都能干。
只要你知道接口就行。
厂家自己的控制软件也是个普通程序啊。
控制背光看起来应该是个标准的操作,数据结构都有。
其实即使是厂家自己专有的某种操作,最终也还是基本上都调用到了DeviceIoControl,只不过发出的控制码是它自己厂家专有的而已。它自己的驱动会认得,别人的驱动不认。
应用程序跟驱动程序执行特殊操作的标准接口就是DeviceIoControl,做驱动程序的人愿意定义任何控制码都行。只要你知道含义,你也能调用。
redroof 发表于 2021-11-29 17:09
其实,原则上厂家软件能干的所有事情,你自己写程序都能干。
只要你知道接口就行。
厂家自己的控制软件也是 ...
是这样
但还真没想过自己实现这个功能,一直认为厂家这部分是封闭不公开没法搞的,也没有去查过什么。。 黑窗口不圆润,上 MFC 盘他!
加个拖动条,拷贝几个 ntddvdeo.h 宏定义,总算编译通过(含可执行文件):
运行效果(XP~Win10兼容):
1L 位置的 exe 居然直接被 Win10 防护掉,目测是 DeviceIoControl 劲太大上头了。附上 virscan.org 扫描结果:
t3486784401 发表于 2021-11-29 18:17
黑窗口不圆润,上 MFC 盘他!
加个拖动条,拷贝几个 ntddvdeo.h 宏定义,总算编译通过(含可执行文件):
给力
这电位器图标{:biggrin:}
我没有尝试重新编译对比,但那个exe火绒没有报毒,应该是劲太大误杀的,用记事本查看里面绑着一个Microsoft.VC90.CRT,不知是不是因为这个 t3486784401 发表于 2021-11-29 18:17
黑窗口不圆润,上 MFC 盘他!
加个拖动条,拷贝几个 ntddvdeo.h 宏定义,总算编译通过(含可执行文件):
闪退,win7系统
应该不会是火绒干的吧 duxingkei 发表于 2021-12-1 11:24
闪退,win7系统
应该不会是火绒干的吧
全是 WinAPI,目测是被干掉了 t3486784401 发表于 2021-11-29 18:17
黑窗口不圆润,上 MFC 盘他!
加个拖动条,拷贝几个 ntddvdeo.h 宏定义,总算编译通过(含可执行文件):
从文件来看……
请问你是在win10上用的visual studio 2005吗?怎么样?
我今天下了个2022的,诶哟,难受死了,硬盘剩余空间的百位数都掉了个字{:mad:}
本想划划船,结果这是来了个货轮{:sweat:} cne53102 发表于 2022-1-7 17:07
从文件来看……
请问你是在win10上用的visual studio 2005吗?怎么样?
是的,win10 下直接运行 vs2005
很爽啊,编译正常,坛子里的工具都是这玩意编译的 t3486784401 发表于 2022-1-7 18:18
是的,win10 下直接运行 vs2005
很爽啊,编译正常,坛子里的工具都是这玩意编译的 ...
好,我换2005,这个2022的难受的不行 t3486784401 发表于 2021-11-29 18:17
黑窗口不圆润,上 MFC 盘他!
加个拖动条,拷贝几个 ntddvdeo.h 宏定义,总算编译通过(含可执行文件):
好用,给力。
比笔记本自带的好用,可以百分之一调节。 t3486784401 发表于 2021-11-29 18:17
黑窗口不圆润,上 MFC 盘他!
加个拖动条,拷贝几个 ntddvdeo.h 宏定义,总算编译通过(含可执行文件):
win7可用 内置显示器的笔记本专用的吧 本帖最后由 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]