キーボード バックライト実装ガイド

このドキュメントでは、互換性のあるWindows 11 ホストに接続するキーボード デバイスのバックライト制御を統合するためのプロトコルの実装について詳しく説明します。 これには、キーボード デバイスのハードウェアの機械的制約、電気的制約、コンポーネントの選択に関するガイダンスは含まれません。

このガイドでは、1 つの明るさレベルがキーボード全体に適用されるシンプルなグローバル キーボード バックライトのみを対象としています。 ゾーン化された RGB 照明またはキーごとの RGB 照明を使用するキーボードについては、代わりに 「ダイナミック ライティング 」を参照してください。

キーボード バックライト統合のサポートは、Windows 11バージョン 25H2、ビルド 26200.7922 以降で利用できます。

キーボード バックライト プロトコルの実装

ここに示されている情報を理解するには、HID プロトコルを十分に理解する必要があります。 HID プロトコルの詳細については、次のリソースを参照してください。

キーボード バックライトのガイダンス

必要な HID コレクション

キーボード バックライトに関連する機能は、HID コンシューマー キーボード バックライト コレクション (ページ 0xC、使用法 0x7) に含める必要があります。

入力ボタン

次の表は、キーボード のバックライト コントロールのホストでサポートされている入力ボタンを定義します。 これらのボタンは、デバイスに明るさの更新を直接適用するのではなく、代わりにホストに明るさ制御操作を延期する必要があります。 多くの場合、ホストは、オプションでホストの明るさアルゴリズムに基づいて調整された Set Level レポートを使用して、入力ボタンに迅速に応答します。 デバイスは、その応答を待っている間、一時的な明るさの変更を適用しないでください。

入力ボタンはデバイスごとに適用され、レポートを発行する以外のデバイスには適用されません。

デバイスが、起動時または接続時に Set Level 出力レポートがないことを示すキーボード バックライト制御をサポートしていないホストに接続されている場合、デバイスは、入力ボタンの直接のローカル明るさ制御にフォールバックする可能性があります。

省略可能な使用法
レポート名 説明 ページ ID
明るさの増加量 ホストに対して、バックライトの明るさを 1 つの論理的な手順で増やすよう要求します。 ホストによってステップ サイズが決定されます。これは、論理範囲とアクティブな明るさアルゴリズムによって異なる場合があります。 Brightness Increment をサポートするデバイスは、Brightness Decrement もサポートすることを強く推奨します。 0x0C 0x0079
明るさの減少 バックライトの明るさを 1 つの論理ステップで減らすようホストに要求します。 ホストによってステップ サイズが決定されます。これは、論理範囲とアクティブな明るさアルゴリズムによって異なる場合があります。 Brightness Decrement をサポートするデバイスでは、明るさの増分もサポートすることを強くお勧めします。 0x0C 0x007A
オン/オフ 制御 (OOC) キーボードバックライトのオン/オフを切り替えるようホストに要求します。 バックライトをオンにすると、ホストはデバイスに送信する適切な 0 以外の明るさの値を決定します。 バックライトをオフにすると、ホストにバックライトの明るさをゼロに設定するよう要求されます。 0x0C 0x007C
Auto ホストに対して、明るさの自動調整を有効または無効にするよう要求します。 0x0C 0x007F
最小値の設定 キーボード バックライトを最小の 0 以外の論理明るさレベル (通常は 1 nit) に設定するようにホストに要求します。 これは、バックライトを完全にオフにすることなく、デバイスでサポートされる最小の明るさを表します。 0x0C 0x007D
最大値の設定 キーボード バックライトを論理的な最大輝度レベルに設定するようにホストに要求します。 0x0C 0x007E
次のレベル キーボードのバックライトの明るさを次の明るいレベルの提案に設定するようにホストに要求します。現在の明るさレベルが最も高いレベルの提案を満たすか、または超えている場合は、オーバーフローが最も低いレベルの提案にオーバーフローします。 レベル提案機能レポートが実装されていない場合、このボタンは無視されます。 0x0C 0x0515
前のレベル 現在の明るさレベルが最も低いレベルの提案と同じかそれ以下の場合、ホストに対してキーボードのバックライトの明るさを次に暗いレベルの提案に設定するよう要求します。ただし、アンダーフローが発生すると、最も高いレベルの提案に切り替わります。 レベル提案機能レポートが実装されていない場合、このボタンは無視されます。 0x0C 0x0516

レベル出力レポートの設定

ホストはこのレポートを送信して、デバイスのバックライトの明るさレベルを設定または変更します。 デバイスは、システムの起動時またはホストへの接続時にこのレポートを受け取ることで、キーボードのバックライト対応ホストを検出できます。

Set Level の出力レポートでは、HID ユニットが「nits」として宣言された線形スケールにおける明るさレベル値の論理範囲を定義する必要があります。 ホストはこの論理範囲を使用して、デバイスでサポートされる可能性のある明るさレベルを決定します。正確な輝度値を出力するためにデバイスを校正する必要はありません。 他のすべてのキーボード バックライト コマンドとホスト操作は、この論理範囲を参照します。

論理最小値が論理最大値以上の場合、デバイスは非準拠と見なされ、ホストによってバックライト制御用に開かれるわけではありません。

レベル値 0 を設定すると、バックライトをオフにするようにデバイスに指示します。 このレポートには、デバイスで論理的な最小値 0 (明るさなし) を使用することを強くお勧めします。

必須の使用法
レポート名 説明 ページ ID
レベルの設定 キーボードのバックライトの明るさを指定された論理ニト値に設定するようにデバイスに指示します。 0x0C 0x007B

キーボードバックライトの明るさ提案機能に関するレポート

このレポートは省略可能です。 デバイスは、ユーザーが [次のレベル] ボタンまたは [前のレベル] ボタンを押したときに、少なくとも2つの明るさプリセットを順番に切り替えてサポートすることを選択できます。 ホストは、システムの起動時またはデバイスがホストに接続または再接続するときに、これらのプリセットのクエリを実行します。 プリセットは、レベルの設定出力レポートで指定された論理範囲内に収める必要があります。 提案値 0 は有効であり、バックライトのオフ状態をプリセットとして示します。

デバイスが [次のレベル] または [前のレベル] 入力ボタンを実装していない場合、レベル提案機能レポートは無視されます。

省略可能な使用法
レポート名 説明 ページ ID
キーボードバックライトレベルの提案 ホストが [次のレベル] または [前のレベル] 入力ボタンを処理するときに考慮する必要がある、推奨される明るさレベルのプリセットを示します。 0x07 0x0517

キーボード バックライト セット レベル機能レポート

このレポートは省略可能です。 デバイスは、このレポートを実装して、起動時または接続時に推奨される初期明るさレベルをホストに通知することを選択できます。たとえば、バックライトがシステムの起動またはデバイスの接続前にユーザーによって調整された場合などです。 ホストは、システムの起動時またはデバイスがホストに接続または再接続するときに、このレポートのクエリを実行します。必要に応じて、この推奨レベルを独自の値でオーバーライドすることを選択します。 推奨値 0 は有効であり、バックライトがオフになっていることを示します。 推奨値が Set Level 出力レポートの論理範囲外の場合、レポートは無視されます。 レベル提案機能レポートのエントリに対応しない推奨値は、論理範囲内にある場合は有効です。

このレポートの論理範囲は、レベルの設定出力レポートの論理範囲内に含まれている必要があります。

省略可能な使用法
レポート名 説明 ページ ID
レベルの設定 現在のバックライトの明るさレベルをホストに通知し、その明るさアルゴリズムにおけるデバイスの初期状態の提案を示します。 0x0C 0x007B

キーボード バックライト ホストの動作

省エネモードでの調光

Windowsでは、省エネモードを有効にすると、キーボードのバックライトが自動的に淡色表示されます。 互換性のあるデバイスでは、この機能は設定>システム>電源とバッテリー>エネルギーセーバー>エネルギーセーバーを使用する際にキーボードの明るさを下げるで切り替えることができ、または次のショートカットでキーボードの明るさを調整できます: 電源とバッテリー

カスタマイズ

この機能は、次の表に示すようにレジストリで構成できます。 既定では、この機能では、省電力機能が有効になっている場合、キーボードのバックライトの明るさに 70% 乗数が適用されます。

レジストリ キー 氏名 タイプ ユニット
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Lighting\Backlight バックライト省エネ機能有効化 REG_DWORD Boolean (1 または 0)
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Lighting\Backlight バックライト エネルギーセーバーマルチプライヤー REG_DWORD パーセント (0 から 100)

この機能は、Windows無人セットアップ またはランタイム プロビジョニングを使用して構成することもできます。

キーボードバックライトの自動輝度調整

キーボードバックライトと光センサーの両方を備えたラップトップなどのデバイスでは、Windowsはキーボードバックライトの明るさの自動調整をサポートしています。 この機能は、外部キーボードが周囲光センサーを備えたデバイスに接続されている場合にもサポートされます。

キーボード バックライトの自動明るさは、ディスプレイの アダプティブ明るさ とは異なりますが、概念的には実装に似ています。

互換性のあるデバイスでは、この機能は設定Bluetooth & デバイスキーボードキーボードバックライトで照明が変化した際にキーボードの明るさを自動的に変更します。または、次のショートカット:キーボードを使用することもできます。

バケット化されたアンビエントライト応答曲線

キーボード バックライトのオートライト機能は、「 アダプティブ輝度」で説明されているように、バケット化された環境光応答 (ALR) 曲線の概念を借用します。

lux バケットとキーボード バックライトの明るさの割合の既定値のマッピングを次の表に示します。 バケットの割合とは、設定値出力レポートの論理的最大値に対する割合を指し、アンビエントライトレベルがバケットの範囲内にある際に使用されます。

ALR カーブ内のすべてのバケットは連続しているか重複している必要があります。バケット間のギャップは許可されません。 各バケットの最小 lux 値は、その最大 lux 値より厳密に小さい必要があります。 周囲光の読み取り値が最も低いバケットの最小 lux を下回る場合は、最も低いバケットの割合が使用されます。 最も高いバケットの最大 lux を超える場合は、最も高いバケットの割合が使用されます。

バケット Min Lux Max Lux パーセンテージ
1 0 6 35
2 5 14 52
3 12 32 70
4 30 45 88
5 40 100 100
6 95 110 88
7 105 160 70
155 205 52
9 200 300 0

複数のバックライト付きキーボードが接続されている場合、すべてのキーボードに同じ ALR 曲線が使用され、そのデバイスの論理的な明るさの範囲に基づいて結果のパーセンテージが各デバイスに適用されます。

カスタマイズ

オートライト有効化と ALR 曲線の値は、次の表に示すようにレジストリで構成できます。 また、Windows 無人セットアップ またはランタイム プロビジョニングを使用して構成することもできます。

レジストリ キー 氏名 タイプ ユニット
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Lighting\Backlight バケット化バックライトの自動調光を有効にする REG_DWORD Boolean (1 または 0)
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Lighting\Backlight バックライト自動輝度バケットマッピング REG_SZ 形式 <minlux>:<maxlux>:<percentage>の 1 つ以上のコンマ区切りのトリプルで構成される文字列。 各トリプルは、ALR 曲線のバケットを表します。 カスタム ALR カーブにギャップがある場合、エントリがゼロの場合、または minlux ≥ maxluxがあるバケットが含まれている場合は、代わりに既定の ALR 曲線が使用されます。

自動輝度調整の手動調整

キーボード バックライトのオートライトが有効になっている間に入力ボタンが押されると、オートライト アルゴリズムの一時的な手動オーバーライドが開始されます。このオーバーライドにより、バケット化された曲線の上に適用される 1 つの追加バケットが生成され、現在のアンビエントライトの読み取り値を起点とし、その読み取りの割合に基づいて、現在の読み取り値の上または下に特定の距離が生成された最小および最大 lux 値が生成されます。

lux バケットと手動オーバーライド範囲定数の間の既定値マッピングを次の表に示します。 ルックアップ テーブル内のエントリには、重複しない連続した lux 範囲が必要です。

バケット Min Lux Max Lux 下限オーバーライドの境界係数 上限オーバーライドの制限因子
1 0 20 1.00 1.00
2 20 40 0.70 0.60
3 40 150 0.60 0.60
4 150 600 0.50 0.50
5 600 1000 0.40 0.40
6 1000 4000 0.30 0.25
7 4000 10000 0.20 0.20
10000 30000 0.15 0.10
9 30000 100000 0.10 0.10

オーバーライド範囲を計算する例として、最新のアンビエントライトの読み取り値が 120 lux のときに入力ボタンを押すユーザーを考えてみましょう。 120 lux が 40 から 150 lux の間に収まるため、対応するルックアップ テーブルエントリはバケット 3 です。 バケットは、現在の読み取り値より低いしきい値 60% を使用して作成されます。 R=120 および A=0.6 では、より低いしきい値は 120(1 - 0.6) = 48 lux です。 上のしきい値も、現在の読み取り値を 60% 上回ります。 ここでも、R=120 および B=0.6 では、上限のしきい値は 120(1 + 0.6) = 192 lux です。 したがって、環境光レベルが [48, 192] の範囲に留まる間、手動オーバーライドが適用されます。

アクティブ化されると、手動オーバーライド バケットの明るさのパーセンテージが、次のいずれかの条件が満たされるまで使用されます。

  • 周囲光の読み取り値がオーバーライド バケットの境界を超え、オーバーライドが取り消された時点でオーバーライド範囲が無視され、バケット化された ALR 曲線を使用して自動ライト コントロールが再開されます。
  • 別の入力ボタンの押下がデバイスから受信され、ホストは明るさの割合を調整し、最新の現在の周囲光の読み取りに従って手動オーバーライド範囲を再計算するように求められます。

カスタマイズ

手動オーバーライド参照テーブルは、次の表に示すようにレジストリで構成できます。 また、Windows無人セットアップまたはランタイム プロビジョニングを使用して構成することもできます。

レジストリ キー 氏名 タイプ ユニット
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Lighting\Backlight バックライトオートブライトネスマニュアルオーバーライドルート (BacklightAutobrightnessManualOverrideLut) REG_SZ <minlux>:<maxlux>:<lowerboundfactor>:<upperboundfactor>形式の 1 つ以上のコンマ区切り 4 タプルで構成される文字列。 各 4 タプルは、参照テーブル内のエントリを表します。 カスタム参照テーブルにギャップがある場合、エントリがゼロの場合、重複するバケットがある場合、または minlux ≥ maxluxするバケットが含まれている場合は、代わりに既定の参照テーブルが使用されます。

HID レポート記述子のサンプル

サンプル キーボード バックライト記述子

次の記述子は、すべての必須およびオプションの使用法をサポートしています。 8 つのキーボード バックライト入力ボタンのサポートが宣言されています。

Set Level 機能レポートと Level Suggestions 機能レポートのすべての論理範囲は、必須の Set Level 出力レポートの論理範囲内に含まれている必要があります。

0x05, 0x0C,                      // UsagePage(Consumer[0x000C])
0x09, 0x07,                      // UsageId(Keyboard Backlight[0x0007])
0xA1, 0x01,                      // Collection(Application)
0x85, 0x01,                      //     ReportId(1)
0x09, 0x79,                      //     UsageId(Keyboard Brightness Increment[0x0079])
0x09, 0x7A,                      //     UsageId(Keyboard Brightness Decrement[0x007A])
0x09, 0x7C,                      //     UsageId(Keyboard Backlight OOC[0x007C])
0x09, 0x7D,                      //     UsageId(Keyboard Backlight Set Minimum[0x007D])
0x09, 0x7E,                      //     UsageId(Keyboard Backlight Set Maximum[0x007E])
0x09, 0x7F,                      //     UsageId(Keyboard Backlight Auto[0x007F])
0x0A, 0x15, 0x05,                //     UsageId(Keyboard Brightness Next[0x0515])
0x0A, 0x16, 0x05,                //     UsageId(Keyboard Brightness Previous[0x0516])
0x15, 0x00,                      //     LogicalMinimum(0)
0x25, 0x01,                      //     LogicalMaximum(1)
0x95, 0x08,                      //     ReportCount(8)
0x75, 0x01,                      //     ReportSize(1)
0x81, 0x06,                      //     Input(Data, Variable, Relative, NoWrap, Linear, PreferredState, NoNullPosition, BitField)
0x0A, 0x17, 0x05,                //     UsageId(Keyboard Backlight Level Suggestion[0x0517])
0x67, 0xE1, 0x00, 0x00, 0x01,    //     Unit('nits', SiLinear, Centimeter:-2, Candela:1)
0x55, 0x04,                      //     UnitExponent(10,000)
0x26, 0xFF, 0x00,                //     LogicalMaximum(255)
0x95, 0x04,                      //     ReportCount(4)
0x75, 0x08,                      //     ReportSize(8)
0xB1, 0x03,                      //     Feature(Constant, Variable, Absolute, NoWrap, Linear, PreferredState, NoNullPosition, NonVolatile, BitField)
0x85, 0x02,                      //     ReportId(2)
0x09, 0x7B,                      //     UsageId(Keyboard Backlight Set Level[0x007B])
0x95, 0x01,                      //     ReportCount(1)
0xB1, 0x03,                      //     Feature(Constant, Variable, Absolute, NoWrap, Linear, PreferredState, NoNullPosition, NonVolatile, BitField)
0x85, 0x01,                      //     ReportId(1)
0x09, 0x7B,                      //     UsageId(Keyboard Backlight Set Level[0x007B])
0x91, 0x02,                      //     Output(Data, Variable, Absolute, NoWrap, Linear, PreferredState, NoNullPosition, NonVolatile, BitField)
0xC0,                            // EndCollection()

上記の記述子は、次の Waratah ファイルを使用して生成されました。

[[unit]]
name = 'meter'
centimeter = [100.0, 1.0]

[[unit]]
name = 'nits'
candela = [1.0, 1.0]
meter = [1.0, -2.0]

[[usagePage]]
name = 'Consumer'

    [[usagePage.usage]]
    id = 0x07
    name = 'Keyboard Backlight'
    types = ['CA']

    [[usagePage.usage]]
    id = 0x515
    name = 'Keyboard Brightness Next'
    types = ['OSC']

    [[usagePage.usage]]
    id = 0x516
    name = 'Keyboard Brightness Previous'
    types = ['OSC']

    [[usagePage.usage]]
    id = 0x517
    name = 'Keyboard Backlight Level Suggestion'
    types = ['SV']

[[applicationCollection]]
usage = ['Consumer', 'Keyboard Backlight']

    [[applicationCollection.inputReport]]

        [[applicationCollection.inputReport.variableItem]]
        usage = ['Consumer', 'Keyboard Brightness Increment']
        logicalValueRange = [0, 1]
        reportFlags = ['Relative', 'PreferredState']

        [[applicationCollection.inputReport.variableItem]]
        usage = ['Consumer', 'Keyboard Brightness Decrement']
        logicalValueRange = [0, 1]
        reportFlags = ['Relative', 'PreferredState']

        [[applicationCollection.inputReport.variableItem]]
        usage = ['Consumer', 'Keyboard Backlight OOC']
        logicalValueRange = [0, 1]
        reportFlags = ['Relative', 'PreferredState']

        [[applicationCollection.inputReport.variableItem]]
        usage = ['Consumer', 'Keyboard Backlight Set Minimum']
        logicalValueRange = [0, 1]
        reportFlags = ['Relative', 'PreferredState']

        [[applicationCollection.inputReport.variableItem]]
        usage = ['Consumer', 'Keyboard Backlight Set Maximum']
        logicalValueRange = [0, 1]
        reportFlags = ['Relative', 'PreferredState']

        [[applicationCollection.inputReport.variableItem]]
        usage = ['Consumer', 'Keyboard Backlight Auto']
        logicalValueRange = [0, 1]
        reportFlags = ['Relative', 'PreferredState']

        [[applicationCollection.inputReport.variableItem]]
        usage = ['Consumer', 'Keyboard Brightness Next']
        logicalValueRange = [0, 1]
        reportFlags = ['Relative', 'PreferredState']

        [[applicationCollection.inputReport.variableItem]]
        usage = ['Consumer', 'Keyboard Brightness Previous']
        logicalValueRange = [0, 1]
        reportFlags = ['Relative', 'PreferredState']

    # Keyboard provided brightness level suggestions for host.
    # Here, the device suggests 4 brightness levels, which the host is free to override as it sees fit.
    [[applicationCollection.featureReport]]

        [[applicationCollection.featureReport.variableItem]]
        usage = ['Consumer', 'Keyboard Backlight Level Suggestion']
        sizeInBits = 8
        logicalValueRange = 'maxUnsignedSizeRange'
        unit = 'nits'
        reportFlags = ['constant']
        count = 4

    # Keyboard reports its last used brightness level as a hint to the host during initialization.
    [[applicationCollection.featureReport]]

        [[applicationCollection.featureReport.variableItem]]
        usage = ['Consumer', 'Keyboard Backlight Set Level']
        sizeInBits = 8
        logicalValueRange = 'maxUnsignedSizeRange'
        unit = 'nits'
        reportFlags = ['constant']

    # Host control of the keyboard brightness level.
    # Device has been previously calibrated to understand what LED 'power level' corresponds to emitted nits.
    [[applicationCollection.outputReport]]

        [[applicationCollection.outputReport.variableItem]]
        usage = ['Consumer', 'Keyboard Backlight Set Level']
        sizeInBits = 8
        logicalValueRange = 'maxUnsignedSizeRange'
        unit = 'nits'