#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 argc, char* argv[]) {
///* program with arguments support */
//if (argc == 3 && strcmp("-b", argv[1]) == 0) {
// setBrightness(atoi(argv[2]));
//}
//else {
// help();
//}
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的教程(正在準備材料,還沒寫完,先存著)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/264581.html
標籤:其他
