文章开头感谢国内唯一(搜索前几页能找到的)完善了背光调节API资料的独苗 :https://blog.csdn.net/weixin_34111819/article/details/86328019

PS:他代码的主干对了,细节处有很多相对于VS的错误,毕竟是DEV写的,这样很难用作工程。

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <iostream>
#include <Ntddvdeo.h>
using namespace std;#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 setBrightness(int level)
{HANDLE h;DWORD nOutBufferSize = 256;BYTE SupportedBrightness[256];DWORD g_supportedLevelCount;DISPLAY_BRIGHTNESS DisplayBrightness;memset(SupportedBrightness, 0, sizeof(SupportedBrightness));/* use createfile function to open lcd.* url from microsoft about IOCTL code.*  http://msdn.microsoft.com/en-us/library/windows/desktop/aa372703%28v=vs.85%29.aspx*//** char* 和 wchar_t* 互相转换参考博客* https://www.cnblogs.com/icqw/p/4614877.html*//** c++代码参考博客* https://blog.csdn.net/weixin_34111819/article/details/86328019*/char temchar[] = "\\\\.\\LCD";char* szSour = temchar;WCHAR Temp[128] = { 0 };mbstowcs(Temp, szSour, strlen(szSour));h = CreateFile(Temp, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, 0);if (h == INVALID_HANDLE_VALUE) {printf("Open \\\\.\\LCD error");exit(1);}/* Query for display supported level */if (!DeviceIoControl(h, IOCTL_VIDEO_QUERY_SUPPORTED_BRIGHTNESS, NULL, 0, SupportedBrightness, nOutBufferSize, &g_supportedLevelCount, NULL)) {printf("IOCTL_VIDEO_QUERY_SUPPORTED_BRIGHTNESS error - %d, - buffer: %d ", g_supportedLevelCount, nOutBufferSize);exit(1);}if (g_supportedLevelCount == 0)      /* 0 means not supported */{printf("\nLCD not support LEVEL COUNT", g_supportedLevelCount);exit(1);}DisplayBrightness.ucDisplayPolicy = 0;DisplayBrightness.ucACBrightness = level;DisplayBrightness.ucDCBrightness = level;/* Set display backlight level */nOutBufferSize = sizeof(DisplayBrightness);if (!DeviceIoControl(h, IOCTL_VIDEO_SET_DISPLAY_BRIGHTNESS, (DISPLAY_BRIGHTNESS*)&DisplayBrightness, nOutBufferSize, NULL, 0, &nOutBufferSize, NULL)) {printf("IOCTL_VIDEO_SET_SUPPORTED_BRIGHTNESS error - %d, - buffer: %d ", g_supportedLevelCount, nOutBufferSize);exit(1);}Sleep(500); /* delay for some time while wmi event changed */nOutBufferSize = sizeof(DisplayBrightness);if (!DeviceIoControl(h, IOCTL_VIDEO_QUERY_DISPLAY_BRIGHTNESS, NULL, 0, (DISPLAY_BRIGHTNESS*)&DisplayBrightness, nOutBufferSize, &nOutBufferSize, NULL)) {printf("IOCTL_VIDEO_QUERY_SUPPORTED_BRIGHTNESS error - %d, - buffer: %d ", g_supportedLevelCount, nOutBufferSize);exit(1);}printf("\nBrightness_AC: %d\nBrightness_DC: %d", DisplayBrightness.ucACBrightness, DisplayBrightness.ucDCBrightness);
}int main() {int a;cin >> a;setBrightness(a);return 0;
}

编译环境是VS,众所周知VS对代码的要求相对严格。所以这位大佬的代码有些部分需要修改。在这里我会指出修改地方以及对修改的部分进行解释。

首先#include <Ntddvdeo.h>直接引用就可以了不要加前缀,VS会自动寻找这个头文件的。

 char temchar[] = "\\\\.\\LCD";char* szSour = temchar;WCHAR Temp[128] = { 0 };mbstowcs(Temp, szSour, strlen(szSour));h = CreateFile(Temp, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, 0);

其次这里的Temp参数,之前大佬的写法是直接“\\\\.\\LCD”,但是这个参数的位置是填到一个WCHAR类型的参数,所以我们要对其进行转换。在转换的过程中VS不允许使用char*指针指向一个字符串常量,所以我们要先将这个字符串常量赋值给一个字符数组,然后再用指针指向它就行了。转换的方法在另一位大佬的博客中,我在代码中已经作为注释给出地址了(感谢各个前辈们做出的贡献)。

最后我要注明一下,这个int setBrightness(int level)中的level的范围是0到100,虽然大多数情况下调到0也能看清,但是万一呢是吧,最好测试的时候别调到零。

上面的是c++代码现在让我们来做成c#模块。(这个模块文末我会放出连接,有百度云和CSDN两个连接,还有gitHub有全部的源代码)我们的思路是将C++编译成DLL模块,然后由c#引用,并在C#中封装成模块的方式来供C#调用。

下面是c++封装DLL的教程(正在准备材料,还没写完,先存着)

建立DLL工程之后对工程稍作修改,改动如下:

将这一句删掉,因为我们要用到这些极少用的内容。

然后将dllmain.cpp的内容改为如下内容

// dllmain.cpp : 定义 DLL 应用程序的入口点。
#define _CRT_SECURE_NO_WARNINGS
#include "pch.h"
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <iostream>
#include <Ntddvdeo.h>
BOOL APIENTRY DllMain(HMODULE hModule,DWORD  ul_reason_for_call,LPVOID lpReserved
)
{switch (ul_reason_for_call){case DLL_PROCESS_ATTACH:case DLL_THREAD_ATTACH:case DLL_THREAD_DETACH:case DLL_PROCESS_DETACH:break;}return TRUE;
}
#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)
extern "C" _declspec(dllexport) void setBrightness(int level)
{HANDLE h;DWORD nOutBufferSize = 256;BYTE SupportedBrightness[256];DWORD g_supportedLevelCount;DISPLAY_BRIGHTNESS DisplayBrightness;memset(SupportedBrightness, 0, sizeof(SupportedBrightness));/* use createfile function to open lcd.* url from microsoft about IOCTL code.*  http://msdn.microsoft.com/en-us/library/windows/desktop/aa372703%28v=vs.85%29.aspx*//** char* 和 wchar_t* 互相转换参考博客* https://www.cnblogs.com/icqw/p/4614877.html*//** c++代码参考博客* https://blog.csdn.net/weixin_34111819/article/details/86328019*/char temchar[] = "\\\\.\\LCD";char* szSour = temchar;WCHAR Temp[128] = { 0 };mbstowcs(Temp, szSour, strlen(szSour));h = CreateFile(Temp, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, 0);if (h == INVALID_HANDLE_VALUE) {printf("Open \\\\.\\LCD error");exit(1);}/* Query for display supported level */if (!DeviceIoControl(h, IOCTL_VIDEO_QUERY_SUPPORTED_BRIGHTNESS, NULL, 0, SupportedBrightness, nOutBufferSize, &g_supportedLevelCount, NULL)) {printf("IOCTL_VIDEO_QUERY_SUPPORTED_BRIGHTNESS error - %d, - buffer: %d ", g_supportedLevelCount, nOutBufferSize);exit(1);}if (g_supportedLevelCount == 0)      /* 0 means not supported */{printf("\nLCD not support LEVEL COUNT", g_supportedLevelCount);exit(1);}DisplayBrightness.ucDisplayPolicy = 0;DisplayBrightness.ucACBrightness = level;DisplayBrightness.ucDCBrightness = level;/* Set display backlight level */nOutBufferSize = sizeof(DisplayBrightness);if (!DeviceIoControl(h, IOCTL_VIDEO_SET_DISPLAY_BRIGHTNESS, (DISPLAY_BRIGHTNESS*)&DisplayBrightness, nOutBufferSize, NULL, 0, &nOutBufferSize, NULL)) {printf("IOCTL_VIDEO_SET_SUPPORTED_BRIGHTNESS error - %d, - buffer: %d ", g_supportedLevelCount, nOutBufferSize);exit(1);}Sleep(500); /* delay for some time while wmi event changed */nOutBufferSize = sizeof(DisplayBrightness);if (!DeviceIoControl(h, IOCTL_VIDEO_QUERY_DISPLAY_BRIGHTNESS, NULL, 0, (DISPLAY_BRIGHTNESS*)&DisplayBrightness, nOutBufferSize, &nOutBufferSize, NULL)) {printf("IOCTL_VIDEO_QUERY_SUPPORTED_BRIGHTNESS error - %d, - buffer: %d ", g_supportedLevelCount, nOutBufferSize);exit(1);}printf("\nBrightness_AC: %d\nBrightness_DC: %d", DisplayBrightness.ucACBrightness, DisplayBrightness.ucDCBrightness);
}

注意这里作为c语言导出DLL是有必要的,否则导出后对外名字可能就改变了,不再是你声明的那个函数名了,会给后面的调用造成一定的困难。

extern "C" _declspec(dllexport) void setBrightness(int level)
//这里的C就是C语言形式导出的意思

设置完成之后右键点击如下位置,然后选择生成解决方案。然后右键打开菜单之后选择“在资源管理器中打开”就能找到项目文件夹,然后找到debug文件夹,在文件夹下面就有dll文件,包括dll在内所有文件烤走就能用了。

完成之后开始创建C#版的DLL对c++的DLL进行二次封装

新建完成后,将DLL拖入项目资源,记住这里不能添加引用,非托管类型的DLL没法添加引用。

新建一个类,并填入如下代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;namespace BGLight
{public class ChangeLight{[DllImport("BGLightChangeDLL.dll")]public static extern void setBrightness(Int32 level);public void Change(Int32 level){setBrightness(level);}}
}

其中下面两句就是引入DLL的语句

[DllImport("BGLightChangeDLL.dll")]public static extern void setBrightness(Int32 level);

然后同样的步骤生成C#版的DLL。

得到c#版的DLL之后,在其他的c#工程只需要在工程中添加对DLL的引用并using相应的命名空间即可。

c#版:https://download.csdn.net/download/u011471253/15500112

c++版:https://download.csdn.net/download/u011471253/15500113

c#配合c++调节屏幕亮度,非伽马以及RGB方案相关推荐

  1. 华硕笔记本无法调节屏幕亮度

    华硕笔记本在安装了Win10之后无法调节屏幕亮度 原因:安装的显卡非华硕官方显卡,导致不兼容情况 解决方案:到华硕官网下载对应的显卡驱动,卸载笔记本本身的显卡,安装官网的显卡 下载链接:https:/ ...

  2. win10调节屏幕亮度_自动调节电脑屏幕亮度软件,保护你的眼睛

    本文共514个字,预计用时2分钟 小伙伴们,今天给大家分享一个小软件,名字叫做 EyeCareApp,中文名:护眼软件 EyeCareApp是一款能够调节屏幕亮度的软件,它可以调整屏幕亮度,滤除蓝光, ...

  3. Win11系统调节屏幕亮度的方法

    目前Win11系统是一款非常火热的电脑操作系统,很多用户都想安装体验,电脑安装了Win11系统后发现屏幕太亮了,看久了眼睛很疲累,于是想要重新修改一下屏幕亮度,但是这个该如何操作呢?接下来小编就来为大 ...

  4. win10调节屏幕亮度_Win8系统笔记本电脑如何调节屏幕亮度?

    Win8系统电脑如何调整笔记本屏幕的亮度?笔记本是Win8系统的,该如何调节屏幕亮度?下面给大家分享具体操作方法. 解决办法: 1.首先,我们移动鼠标点击桌面上的"控制面板",然后 ...

  5. 重温Android——调节屏幕亮度

    唔,明天要去网易笔试Android实习生,于是翻出以前写的Android代码,温习一下,想象一下,当然,这必然不会导致太多的本质改变,不过总得试试,就这样, 上代码. 1 package androi ...

  6. 电脑调节屏幕亮度快捷键失灵の解决方案

    一.前言 博主的笔记本平时也不太调整屏幕亮度,基本都是让它保持在60. 但最近突发奇想用了一下之前原本好使的快捷键Fn+F8/F9,想调一下屏幕亮度,结果发现这两个快捷键失灵了.于是上网搜了好多解决方 ...

  7. linux屏幕怎么暗一点,Ubuntu 12.10 调节屏幕亮度经验分享

    我一直用的是Ubuntu,刚开始,我不知道Ubuntu屏幕亮度过亮,每次到学校机房的XP上都觉得其桌面太丑了(亮度所致)^-^.    这几天我才发现我眼睛有时候受不了,到网上一查才知道是屏幕太亮所致 ...

  8. win10的怎么调计算机亮度,Win10系统调节屏幕亮度的三种方法【图文】

    全新的Win10系统里面的界面设计非常好看,而且有些也是色彩十分明亮.那么如果觉得太亮的话,要怎么调节呢?下面就给大家介绍Win10系统调节屏幕亮度的四种方法. 调节方法一: 1.首先打开开始菜单,接 ...

  9. 计算机无法屏幕亮度,win7电脑屏幕亮度无法调节怎么办?调节屏幕亮度的方法...

    众所周知,调节一个舒适屏幕亮度是非常重要的,可以保护眼睛.最近有用户发现屏幕亮度无法调节,使用键盘上的组合键调节屏幕亮度后,发现屏幕突然变得较暗.想再将屏幕调亮发现试了好几个方法都没有效果,该怎么解决 ...

最新文章

  1. python代码运行不了怎么办_selenium ide 生成的 Python 代码无法执行是怎么回事?
  2. fillstyle属性_html设置或返回用于填充绘画的颜色渐变或模式的属性fillStyle
  3. mysql的groupby原理是啥_mysql数据库groupby报错原理是什么?
  4. IDEA启动Tomcat AJP连接器配置secretRequired=“true“,但是属性secret确实空或者空字符串,这样的组合是无效的解决办法
  5. mysql hint 简书_MySQL
  6. mysql 验证码过期时间_简单的行为控制管理方法,自动登录,session定时验证码过期...
  7. 高斯积分公式matlab_数值微分与数值积分(一)
  8. 在工作中你卑微到什么程度?
  9. TDtree冲刺第四天
  10. php二维数组以某个键进行排序
  11. 如何统计项目代码行数
  12. php商店管理系统,基于PHP的商店管理系统.doc
  13. 关于计算机文献检索报告,计算机专业文献检索论文参考选题.doc
  14. 《道德经》里的世界观(一种解读,仅供参考)
  15. win10打开计算机出现马赛克,传授win10系统在线播放视频出现马赛克的技巧
  16. Python 格式化输出详解
  17. html文本输入框代码是什么?如何创建html文本输入框
  18. 【转载】Web2.0创业时代将终结
  19. 从前慢-深入理解JVM-篇章2
  20. . net core在图片上写字

热门文章

  1. CSS box-shadow 详解
  2. Deadline = Diedline?拖延症幻想美好
  3. 关于Numpy数组中属性shape的理解
  4. STM32 SWD模式下SPI3无法使用的问题
  5. JS CSS 超出字符省略号,获取字符串实际所占长度,显示文字提示tooltip
  6. cfg格式文件在服务器哪里,cfg文件,小编教你怎么打开cfg文件
  7. dashboard android,Dashboard软件下载
  8. 两种方式建立Vsftpd虚拟用户
  9. Flutter ListView滚动到指定条目
  10. 国庆头像html代码