c # Coopere con c ++ para ajustar el brillo de la pantalla, el esquema no gamma y RGB

#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;
}

El entorno de compilación es VS. Como todos sabemos, VS tiene requisitos relativamente estrictos en el código. Así que algunas partes del código de este grandullón necesitan ser modificadas. Aquí señalaré los cambios y explicaré los cambios.

En primer lugar, #include <Ntddvdeo.h> se puede citar directamente. No agregue un prefijo, VS buscará automáticamente este archivo de encabezado.

	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);

En segundo lugar, el parámetro Temp aquí, la escritura del tipo grande anterior es directamente "\\\\. \\ LCD", pero la posición de este parámetro es completar un parámetro de tipo WCHAR, por lo que tenemos que convertirlo. Durante el proceso de conversión, VS no permite que el puntero char * apunte a una constante de cadena, por lo que primero debemos asignar la constante de cadena a una matriz de caracteres y luego usar el puntero para señalarla. El método de conversión está en el blog de otro grandote, y he dado la dirección como comentario en el código (gracias a las contribuciones de los predecesores).

Por último, quiero especificar que el nivel en este int setBrightness (int level) va de 0 a 100, aunque en la mayoría de los casos se puede ver claramente al ajustarlo a 0, pero ¿qué pasa? Es mejor no ajustarlo. al probar. A cero.

Lo anterior es el código de C ++. Ahora hagamos un módulo de C #. (Liberaré la conexión al final de este módulo, hay dos conexiones a Baidu Cloud y CSDN, y gitHub tiene todo el código fuente) Nuestra idea es compilar C ++ en un módulo DLL y luego hacer referencia a él mediante c #, y encapsularlo en un módulo en C # La forma de llamar a C #.

El siguiente es un tutorial de la DLL de empaquetado de c ++ (los materiales se están preparando, aún no están terminados, guárdelos primero)

Supongo que te gusta

Origin blog.csdn.net/u011471253/article/details/114170009
Recomendado
Clasificación