c#c ++と連携して、画面の明るさ、非ガンマおよび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;
}

コンパイル環境は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)のレベルが0〜100の範囲であることを指定したいと思います。ほとんどの場合、0に調整するとはっきりと見えますが、調整しないことをお勧めします。テスト時。ゼロに。

上記はc ++コードです。c#モジュールを作成しましょう。(このモジュールの最後で接続を解放します。BaiduCloudとCSDNへの接続は2つあり、gitHubにはすべてのソースコードがあります)私たちのアイデアは、C ++をDLLモジュールにコンパイルし、それをc#で参照することです。 C#のモジュールにカプセル化するC#を呼び出す方法。

以下は、c ++パッケージDLLのチュートリアルです(資料は準備中ですが、まだ完成していません。最初に保存してください)

おすすめ

転載: blog.csdn.net/u011471253/article/details/114170009