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 の場合そのままで大丈夫でした。
本当はボリューム変更や HID のキー周りも調べたのですが、結局何もしなくても
画面表示がないだけでボリューム変更のショートカットは有効でした。