次の方法で共有


デジタイザー レポート記述子での使用法のサポート

使用法とは、HID レポート内の値、ボタン、またはコレクションの名前のことです。 ホストは、ペンまたはタッチ デバイスからデータを抽出するときに、次の使用法を使用します。

メンバー 説明 ページ id Device
x 接触位置の X 座標。 デスクトップ 0x30 ペン、タッチ
接触位置の Y 座標。 デスクトップ 0x31 ペン、タッチ
ヒント 指またはペンがデジタイザーの表面に触れている場合に設定します。 デジタイザー 0x42 ペン、タッチ
In-range 指またはペンがデジタイザーの表面近くにあるとき、またはデジタイザーの表面に触れているときに設定します。 デジタイザー 0x32 ペン、タッチ
信頼度 触れているのが指である (つまり、指入力をトリガーしないようにする必要がある手のひらなどの部分ではない) 場合に設定します。 デジタイザー 0x47 タッチ
接触部分の幅。 デジタイザー 0x48 タッチ
Height 接触部分の高さ。 デジタイザー 0x49 タッチ
スキャン時刻 相対スキャン時間。 デジタイザー 0x56 タッチ
気圧 ユーザーが接触点に加えている圧力の大きさ。 デジタイザー 0x30 ペン、タッチ
Barrel スタイラスの胴体ボタンが押された場合に設定します。 デジタイザー 0x44 ペン
アジマス Z 軸を回転軸とした、カーソルの反時計回りの回転。 デジタイザー 0x3f ペン、タッチ
Invert ペンの反対側がデジタイザーの表面近くにあるときに設定します。 デジタイザー 0x3C ペン
消しゴム ペンの反対側がデジタイザーの表面に触れているときに設定します。 デジタイザー 0x45 ペン
X Tilt Y-Z 平面と、ポインター デバイス軸および Y 軸を含む平面との間の角度。 デジタイザー 0x3d ペン
Y Tilt X-Z 平面とポインターデバイス平面との間の角度。正の値である場合は、ユーザー側に傾いています。 デジタイザー 0x3E ペン
Twist カーソル自体の軸を回転軸とした、カーソルの時計回りの回転。 デジタイザー 0x41 ペン

メモ 上の表に記載されている使用法は Windows に認識され、WM_POINTER メッセージを使用してアプリケーションに配信されます。

メモ ポインター デバイスは、追加の使用法 (ベンダー固有の使用法を含む) を自由にサポートできます。 追加の使用法は、WM_POINTER メッセージでアプリケーションに配信されることはありません。 これらの使用法の値は、GetRawPointerDeviceData 関数を使用して取得できます。 これらの使用法を GetRawPointerDeviceData 関数から取得できるようにするには、X および Y の使用法と同じレポートに配置する必要があります。

デジタイザー用 HID 記述子

Windows 8 以降では、タッチ デジタイザーをタッチ スクリーンとして表す必要があります (page = 0x0D、usage = 0x04)。 スタイラス デジタイザーは、統合ペン (page = 0x0D、usage = 0x02) または外部ペン (page = 0x0D、usage = 0x01) として表す必要があります。 統合されたタッチ デバイスとペン デバイスは、物理的に接続されているディスプレイにマップされます。 外部ペン デバイスは仮想デスクトップにマップされます。

デジタイザーに必要な HID 使用法

すべてのデジタイザーには、次の使用法が必要です。 必要な使用法の一部をサポートしていないデバイスは、Windows 8 で機能しません。

XY
XY は、接触部分の座標を報告します。 Windows 8 では、1 つのデバイスが接触部分ごとに 2 つのポイントを報告できます。 最初のポイント (T と呼ばれる) はユーザーがタッチすることを意図したポイントと見なされ、2 番目のポイント (C と呼ばれる) は接触部分の中心と見なされます。 デバイスが T と C を報告するには、2 つの X 値と 2 つの Y 値が含まれる使用法配列が必要です。 配列内の最初の位置の値は T の座標として解釈され、2 番目の位置の値は C の座標として解釈されます (使用法配列の存在を示すため、両方の使用法のレポート数は 2 となります)。 C を報告するデバイスは、WidthHeight の使用法も報告する必要があります。 ホストは C を使用して、接触を囲む四角形を作成します。 デバイスが X と Y のペアを 1 つだけ報告した場合、ホストは T と C に対してそのペアを使用します。サンプルのタッチ記述子では、XY の両方について使用法配列が使用されています。サンプルの記述子から抜粋された次のデータは、T のみをサポートするデバイスと T と C をサポートするデバイスの違いを示しています。

T のみを報告するデバイスは、X と Y のプロパティについて使用法配列を使用しません (そのため、次に示すように各使用法のレポート数は 1 となります)。

0x05, 0x01,                         //       USAGE_PAGE (Generic Desk..
    0x26, 0xff, 0x0f,                   //       LOGICAL_MAXIMUM (4095)         
    0x75, 0x10,                         //       REPORT_SIZE (16)             
    0x55, 0x0e,                         //       UNIT_EXPONENT (-2)           
    0x65, 0x13,                         //       UNIT(Inch,EngLinear)                  
    0x09, 0x30,                         //       USAGE (X)                    
    0x35, 0x00,                         //       PHYSICAL_MINIMUM (0)         
    0x46, 0xb5, 0x04,                   //       PHYSICAL_MAXIMUM (1205)
    0x95, 0x01,                         //       REPORT_COUNT (1)         
    0x81, 0x02,                         //       INPUT (Data,Var,Abs)         
    0x46, 0x8a, 0x03,                   //       PHYSICAL_MAXIMUM (906)
    0x09, 0x31,                         //       USAGE (Y)                    
    0x81, 0x02,                         //       INPUT (Data,Var,Abs)

T と C をサポートするデバイスは、X と Y の値を報告するために使用法配列を使用します。 XY の両方で、レポート数は 2 となります。

0x05, 0x01,                         //       USAGE_PAGE (Generic Desk..
    0x26, 0xff, 0x0f,                   //       LOGICAL_MAXIMUM (4095)         
    0x75, 0x10,                         //       REPORT_SIZE (16)             
    0x55, 0x0e,                         //       UNIT_EXPONENT (-2)           
    0x65, 0x13,                         //       UNIT(Inch,EngLinear)                  
    0x09, 0x30,                         //       USAGE (X)                    
    0x35, 0x00,                         //       PHYSICAL_MINIMUM (0)         
    0x46, 0xb5, 0x04,                   //       PHYSICAL_MAXIMUM (1205)
    0x95, 0x02,                         //       REPORT_COUNT (2)         
    0x81, 0x02,                         //       INPUT (Data,Var,Abs)         
    0x46, 0x8a, 0x03,                   //       PHYSICAL_MAXIMUM (906)
    0x09, 0x31,                         //       USAGE (Y)                    
    0x81, 0x02,                         //       INPUT (Data,Var,Abs)

メモ これらの例では、グローバル アイテムが変更されるまですべてのメイン アイテムで同じ値を使用する HID 規則を利用しています。 これにより、XY の両方の使用法で、レポート数としてただ 1 つのエントリを共有できます。

ペンデバイスは、Cがこれらのデバイスに関連しないため、記述子の最初の例を使用する必要があります。

XY の両方の使用法で、次のグローバル アイテムを指定する必要があります。

  • 論理最小値
  • 論理最大値
  • 物理最小値
  • 物理最大値
  • ユニット
  • 単位指数

デバイスの物理範囲とこれらの単位を正確に報告する必要があります。 情報が不正確な場合、デバイスは正しく動作しません。 また、デバイスが報告するデータは、レポート記述子で指定された論理範囲内にある必要があります。 報告された値がこの範囲外にある場合は無効なデータと見なされ、値は最も近い境界値 (論理最小値または論理最大値) に変更されます。

ヒント
Tip (ペン先) スイッチは、デジタイザー表面に指またはペンが触れていることと、表面から離れたことを示すために使用します。 レポート サイズが 1 のメイン アイテムが必要です。 レポートを配信する際、指またはペンがデジタイザー表面に接触している場合はこのビット位置を設定する必要があります。 それ以外の場合は、このビットをクリアする必要があります。

スキャン時刻
Scan Time (スキャン時刻) では、相対時刻が 100 マイクロ秒単位で報告されます。 この値は、非アクティブの期間に続いて、デバイスでデータのレポートが開始された後に報告された最初のフレームからの差分を表します。 最初に受信されたスキャン時刻は、その後に報告される時刻の基準時間として処理されます。 報告されたスキャン時刻から次のスキャン時刻までの差分は、デジタイザーのスキャン頻度を反映している必要があります。 他の使用法とは異なり、ホストではスキャン時刻の使用法の単位に柔軟性がないことに注意してください。 このカウンターに割り当てられるバイトは 1 バイトのみであるため、この値はロール オーバーする必要があります。 スキャン時刻の値は、フレーム内のすべての接触で同じである必要があります。 この要件は、ハイブリッド モードを使用してデータを報告するデバイスにも適用されます。

メモ この使用法はタッチ デバイスでのみ必要です。

In-range
デバイスで Z 軸の検出がサポートされている場合、デジタイズが可能な領域内にペンがあるときに、デジタイザーは入力レポートで In-range (範囲内) 使用法を設定する必要があります。 デバイスが Z 軸の検出をサポートしていない場合、ドライバーはレポート記述子に In-range 使用法を含めないようにする必要があります。

以前のバージョンの Windows では、デバイスが範囲内にあることをタッチ デジタイザー ドライバーが報告する方法についてさまざまなガイドラインがありました。

ペンとタッチをサポートするデバイスでは、ペンのトップ レベル コレクションで XY の使用法について NULL 状態をサポートする必要があります。 ペンを検出したが X と Y の値を正確に検出できない場合、デバイスは X と Y について NULL 値を報告し、In-range 使用法を設定する必要があります。 関連する使用法について NULL をサポートしていることをデバイスが示している場合、NULL 値は、使用法の値が指定された論理範囲外にあることを意味します。 スタイラスが表面に十分に近づき、X と Y の値を検出できた時点で、デバイスは正確な X 値と Y 値を報告できます。 このプロトコルにより、ホストはペンが範囲内にあるときのパーム リジェクションを実装できます。

なお、値が論理範囲外にあるときにこのプロトコルに従って処理することをホストが認識するのは、X と Y が NULL 状態をサポートしているという事実を示すビットがレポート記述子に具体的に含まれる場合のみです。 そうでない場合、論理範囲外の値は、単に最も近い境界値に移動されます。 次のレポート記述子からの抽出は、XとYのNULLをサポートするデバイスと、そうでないデバイスの違いを示しています。 なお、NULL のサポートはペンのトップ レベル コレクションでのみ必要です。 タッチトップレベルコレクションは、この目的のためにXとYのNULLをサポートする必要はありません。

X と Y について NULL がサポートされる場合のレポートの抜粋:

0x05, 0x01,                         //     USAGE_PAGE (Generic Desktop) 42
    0x09, 0x30,                         //     USAGE (X)                    44
    0x75, 0x10,                         //     REPORT_SIZE (16)             46
    0x95, 0x01,                         //     REPORT_COUNT (1)             48
    0xa4,                               //     PUSH                         50
    0x55, 0x0d,                         //     UNIT_EXPONENT (-3)           51
    0x65, 0x13,                         //     UNIT (Inch,EngLinear)        53
    0x35, 0x00,                         //     PHYSICAL_MINIMUM (0)         55
    0x46, 0x3a, 0x20,                   //     PHYSICAL_MAXIMUM (8250)      57
    0x26, 0xf8, 0x52,                   //     LOGICAL_MAXIMUM (21240)      60
    0x81, 0x42,                         //     INPUT (Data,Var,Abs)         63
    0x09, 0x31,                         //     USAGE (Y)                    65
    0x46, 0x2c, 0x18,                   //     PHYSICAL_MAXIMUM (6188)      67
    0x26, 0x6c, 0x3e,                   //     LOGICAL_MAXIMUM (15980)      70
    0x81, 0x42,                         //     INPUT (Data,Var,Abs)         73

X と Y について NULL がサポートされない場合のレポートの抜粋:

0x05, 0x01,                         //       USAGE_PAGE (Generic Desk..
    0x26, 0xff, 0x0f,                   //       LOGICAL_MAXIMUM (4095)         
    0x75, 0x10,                         //       REPORT_SIZE (16)             
    0x55, 0x0e,                         //       UNIT_EXPONENT (-2)           
    0x65, 0x13,                         //       UNIT(Inch,EngLinear)                  
    0x09, 0x30,                         //       USAGE (X)                    
    0x35, 0x00,                         //       PHYSICAL_MINIMUM (0)         
    0x46, 0xb5, 0x04,                   //       PHYSICAL_MAXIMUM (1205)
    0x95, 0x01,                         //       REPORT_COUNT (1)         
    0x81, 0x02,                         //       INPUT (Data,Var,Abs)         
    0x46, 0x8a, 0x03,                   //       PHYSICAL_MAXIMUM (906)
    0x09, 0x31,                         //       USAGE (Y)                    
    0x81, 0x02,                         //       INPUT (Data,Var,Abs)

XY について NULL 値をサポートするペン デバイスの完全な記述子については、「タッチとペンのサポート」セクションを参照してください。

メモ この使用法はすべてのペン デバイスで必須ですが、タッチ デバイスでは省略可能です。

オプションの HID 使用法

次の使用法は省略可能ですが、デジタイザー ハードウェアでサポートされている場合は実装する必要があります。 これらの使用法をサポートしていないデジタイザーでは、レポート記述子に含める必要はありません。

WidthHeight
WidthHeight の使用法は、タッチの接触部分を囲む境界ボックスの幅と高さを表します。 報告される値は、「UP」イベントが報告されている場合を除き、0にする必要があります。

また、WidthHeight は、WM_POINTER メッセージ経由でアプリケーション開発者に公開されます。

信頼度
Confidence (信頼度) は、タッチの接触が意図的なタッチか偶発的なタッチかをデバイスが推定した値です。 意図的なタッチであることが確実な場合は、Confidence 使用法を 1 (true) に設定します。 待ち時間が必要な範囲内にある間、デバイスは偶発的なタッチを可能な限り完全に拒否する必要があります。 意図的なタッチであることが確実ではなく、デバイスがタッチを偶発的なものとして拒否しなかった場合は、Confidence 使用法を 0 (false) に設定します。 デバイスが偶発的なタッチを常に拒否する場合は、信頼度使用法を含める必要はありません。

"圧力"
Pressure (圧力) は、指またはペンがデジタイザーの表面に加えた力の測定値です。 圧力に対して許容される範囲に関する制限はありません。 ただし、デバイスで指定された範囲は、クライアントアプリケーションにデータを配信するときに0–1024の範囲に正規化されます。

Barrel
ペンの胴体ボタンが押されている場合は、Barrel (胴体) を設定する必要があります。 それ以外の場合は、リセットする必要があります。 Barrel は Windows で使用され、ペン先の機能をメイン アクション (タップ、ドラッグ) とセカンダリ アクション (右タップ、右ドラッグ) の間で切り替えます。

PressureBarrel は省略可能な使用法ですが、ペン デジタイザー用に実装することをお勧めします。 これらの使用法を実装すると、追加の値が追加されます。Pressure では、本物のペンで描いたように見せるためにペン ストロークの幅が定義されます。また、Barrel を使った切り替えにより、ペンの使用時にマウスの右ボタン機能を実現できます。

X Tilt
X Tilt (X 傾斜) は、Y-Z 平面と、ペンの縦軸および Y 軸を含む平面との間の平面角度を表します。

物理範囲と論理範囲を指定する必要があります。 物理範囲は -90 ~ 90 である必要があります。 論理範囲は、小数点以下 2 桁以上の正確なデータを配信するのに十分な大きさである必要があります。 物理範囲にはラジアンも使用できます。 次の一覧は、一般的な論理範囲と物理範囲の組み合わせを示しています。

  • 論理最小値: -9000
  • 論理最大値: 9000
  • 単位: 度
  • 単位指数: -2
  • 物理最小値: -9000
  • 物理最大値: 9000

Y Tilt
Y Tilt (Y 傾斜) は、X-Z 平面と、ペンの縦軸および X 軸を含む平面との間の平面角度を表します。

物理範囲と論理範囲を指定する必要があります。 物理範囲は–90から90の間である必要があります。 論理範囲は、小数点以下 2 桁以上の正確なデータを配信するのに十分な大きさである必要があります。 物理範囲にはラジアンも使用できます。 次の一覧は、一般的な論理範囲と物理範囲の組み合わせを示しています。

  • 論理最小値: 0
  • 論理最大値: 18000
  • 単位: 度
  • 単位指数: -2
  • 物理最小値: -9000
  • 物理最大値: 9000

Twist
Twist (回転) は、カーソル自体の長軸を回転軸とした、カーソルの時計回りの回転を指定します。

物理範囲と論理範囲を指定する必要があります。 物理範囲は 0 ~ 360 である必要があります。 論理範囲は、小数点以下 2 桁以上の正確なデータを配信するのに十分な大きさである必要があります。 物理範囲にはラジアンも使用できます。 この場合、論理範囲は、小数点以下 4 桁以上の正確な値を報告するのに十分な大きさである必要があります。 次の一覧は、一般的な論理範囲と物理範囲の組み合わせを示しています。

  • 論理最小値: 0
  • 論理最大値: 62831
  • 単位: ラジアン
  • 単位指数: -4
  • 物理最小値: 0
  • 物理最大値: 62831

"アジマス"
Azimuth (アジマス) は、Z 軸を回転軸とするカーソルの反時計回りの回転を、完全な円形の範囲で指定します。 物理範囲と論理範囲を指定する必要があります。 物理範囲は 0 ~ 360 である必要があります。ただし、デバイスはこの範囲全体を報告する場合と、半分の範囲を報告する場合 (ハードウェアの性能に基づき、タッチの楕円が対称形である場合) があります。 論理範囲は、小数点以下 2 桁以上の正確なデータを配信するのに十分な大きさである必要があります。 物理範囲にはラジアンも使用できます。 この場合、論理範囲は、小数点以下 4 桁以上の精度で値を報告するのに十分な大きさである必要があります。 次の一覧は、一般的な論理範囲と物理範囲の組み合わせを示しています。

  • 論理最小値: 0
  • 論理最大値: 36000
  • 単位: 度
  • 単位指数: -2
  • 物理最小値: 0
  • 物理最大値: 36000

メモ 単位が度の場合は単位指数が -2、単位がラジアンの場合は単位指数が -4 である必要があります。