Windows ノート PC の backlight の明るさ変更方法

backlightwin を作るときに調べたもの。

MSDN IOCTL_VIDEO_QUERY_SUPPORTED_BRIGHTNESS

LCD デバイスを open します。

HANDLE	hlcd= CreateFile(
		_T("\\\\.\\LCD"),
		GENERIC_READ|GENERIC_WRITE,
		FILE_SHARE_READ|FILE_SHARE_WRITE,
		NULL,
		OPEN_EXISTING,
		0,
		NULL );

バックライトを何段階に調光可能か調べます。

const DWORD	levelbuffersize= 256;
unsigned char	levelbuffer[levelbuffersize];
DWORD		levelCount= 0;
DeviceIoControl(
		hlcd,
		IOCTL_VIDEO_QUERY_SUPPORTED_BRIGHTNESS,
		NULL,
		0,
		(LPVOID)levelbuffer,
		levelbuffersize,
		&levelCount,
		NULL
	);

levelbuffer にはバックライトの明るさテーブルが返ります。
たとえば VAIO type P なら 9 段階に調整可能で、levelbuffer には 9 個の値が
返ります。内容は下記の通り。

4 16 28 40 52 64 76 88 100

バックライトの明るさが 4% から 100% まで、上記の刻みで変更できることを意味
しています。levelCount は返したパラメータのサイズなので、結果として調整可能な
段階に等しくなります。

デバイス(PC)によってこの値も刻み方も変わるようです。
明るさの値 (DISPLAY_BRIGHTNESS の UCHAR ucACBrightness など) は unsigned char
を使うため、テーブルも最大 256 まで。
でも 0~100% の値だから 102 以上のサイズに意味があるのかどうかわかりません。

現在の明るさの読み出し。

DWORD	bytereturn= 0;
DISPLAY_BRIGHTNESS	bright;
DeviceIoControl(
		hlcd,
		IOCTL_VIDEO_QUERY_DISPLAY_BRIGHTNESS,
		NULL,
		0,
		(LPVOID)&bright,
		sizeof(DISPLAY_BRIGHTNESS),
		&bytereturn,
		NULL
	);

bright.ucACBrightness, bright.ucDCBrightness に現在の明るさが入ります。
明るさは IOCTL_VIDEO_QUERY_SUPPORTED_BRIGHTNESS で読み出したテーブルの
通り、必ず 4 , 16, 28, … 100 の値のどれかになります。
ucDisplayPolicy は現在 AC か DC なのかフラグが設定されるはずですが、
VAIO type P では常に 2 (DC power) が入っています。

明るさを変更する場合。

DeviceIoControl(
		hlcd,
		IOCTL_VIDEO_SET_DISPLAY_BRIGHTNESS,
		(LPVOID)&bright,
		sizeof(DISPLAY_BRIGHTNESS),
		NULL,
		0,
		&bytereturn,
		NULL
	);

IOCTL_VIDEO_QUERY_DISPLAY_BRIGHTNESS で読み出した構造体をそのまま
書き換えて渡せばよいはずです。ucDisplayPolicy のフラグが 3 なら DC/AC
両方を意味するため、より確実に変更が可能となると思われます。
VAIO type P の場合そのままで大丈夫でした。

backlightwin v1.00

本当はボリューム変更や HID のキー周りも調べたのですが、結局何もしなくても
画面表示がないだけでボリューム変更のショートカットは有効でした。

関連エントリ
VAIO type P Windows7 beta とバックライト調整など