次の方法で共有


GameInput のデバイス

システムに物理的に接続される入力デバイスは、いずれも IGameInputDevice インターフェイスによって表されます。 読み取り値と同様に、デバイス インスタンスは参照カウントされるシングルトンです。つまり、インターフェイス ポインターの等価性を比較できます。 一般的なアプリケーションの入力コードの大部分は、この方法でのみ、つまり他の API を呼び出すときの一種のデバイス識別子として (たとえば、読み取り値を取得するときのフィルターとして) のみデバイス インスタンスを使用します。

通常、IGameInputDevice インターフェイスのメソッドが呼び出されるのは、アプリケーションが特定のデバイスと何らかの形でやり取りしなければならない場合のみです。 最も一般的な理由は、触覚フィードバックまたはフォース フィードバックのコマンドをデバイスに送信するためです。 ただし、このインターフェイスはデバイスのプロパティも公開し、より高度なコードで必要になる可能性がある低レベルのデバイス I/O へのアクセスを提供します。

デバイスのプロパティ

アプリケーションがデバイスに関する特定の情報を把握する必要がある場合は、デバイスの GameInputDeviceInfo 構造体にアクセスできます。 この構造体はデバイスに関する豊富な情報を含んでいますが、使用に関して理解しておくべき点がいくつかあります。

デバイス情報は大規模 (場合によっては 10 KB 以上) になる可能性があります。 効率上の理由から、GameInput API はデバイス データのコピーを作成せず、代わりに GameInput の内部に保存されたデータへの直接アクセスを一時的にアプリケーションに許可します。 この方法は、バッファーの割り当てと大規模なメモリ転送を回避することで高パフォーマンスなコードを実現するのに適しています。多くの場合、アプリケーションが必要としているのはデータの一部分のみであるためです。 この方法では、GameInputDeviceInfo 構造体のデバイス情報データ ブロック内に他の領域へのポインターをネストすることも可能です。これにより、可変サイズの出力と詳細コピーに伴う複雑さを加えることなく、さまざまなサポート情報の配列をこのデータ ブロックで見つけられるようになります。

デバイス ID

デバイス情報で入手できる重要な情報の 1 つに、デバイスのアプリケーション ローカルなデバイス ID があります。 これは、アプリケーションの再起動やシステムの再起動をまたいでもデバイスを一意に識別する特殊な 32 バイト値です。 また、この ID はワイヤレス デバイスの切断と再接続をまたいでも変わりません。同じ USB ポートに再接続されるかぎりは、接続された USB デバイスの場合も同様です。

アプリケーション ローカルなデバイス ID は、アプリケーションの有効期間を超えて特定のデバイスを識別するために最もよく使用されます。 たとえば、入力マッピング UI を持つゲームでは、このデバイス ID を使用して、アプリを起動するたびにユーザーの入力構成を同じデバイスに適用させることができます。 これは、同じように見える複数のデバイス (たとえば、フライト シミュレーターで使われる類似した一連の計器盤デバイス) 間の複雑なマッピングをサポートするアプリケーションには特に重要です。

デバイスの列挙

ほとんどのアプリケーションには不要ですが、GameInput は接続されているデバイスの明示的な列挙をサポートしています。 これは、IGameInput インターフェイスの RegisterDeviceCallback メソッドを使用して実行できます。

HRESULT RegisterDeviceCallback(
    _In_opt_ IGameInputDevice * device,
    _In_ GameInputKind inputKind,
    _In_ GameInputDeviceStatus statusFilter,
    _In_ GameInputEnumerationKind enumerationKind,
    _In_opt_ void * context,
    _In_ GameInputDeviceCallback callbackFunc,
    _Out_opt_ _Result_zeroonfailure_ GameInputCallbackToken * callbackToken);

このメソッドは、まず接続されている各デバイスに対する初期コールバックを一斉にトリガーし、その後は新しいデバイスが接続または切断されるたびに後続のコールバックをトリガーすることにより、デバイスの列挙とデバイスの接続/切断の通知の両方を処理します。 アプリケーションでは GameInputEnumerationKind パラメーターを使用して、すべての内部コールバックがディスパッチされるまで関数をブロックするか、または関数を直ちに戻して非同期でコールバックをディスパッチするかどうかを制御できます。

列挙に含まれるデバイスの種類と、コールバックをトリガーするデバイスの状態変更の種類を制御するために、いくつかのフィルターを利用できます。 詳細については、「RegisterDeviceCallback」を参照してください。 コールバックのしくみに関する一般的な情報については、「GameInput のコールバック」を参照してください。

集約デバイス

複数のキーボードが同時に接続されている場合、ほとんどの入力 API は、すべての入力が 1 つの仮想システム キーボードからの入力であるかのように結合した形でアプリケーションへの入力を表します (これはマウスにも当てはまります)。ただし GameInput は通常、各デバイスとその入力を個別に公開します。 これによって多くの可能性 (たとえば、ローカル マルチプレイヤー ゲームでどのユーザーのチャットパッドが入力を生成しているかを見分けられるなど) が開かれますが、同時に、この機能を必要としないアプリケーションでは複雑さが増します。

この問題に対処するために、GameInput は集約デバイスという概念をサポートしています。 IGameInput インターフェイスの CreateAggregateDevice メソッドを使用すると、アプリケーションで仮想 IGameInputDevice インスタンスを作成し、このインスタンスで単一の GameInputKind のすべてのデバイスからの入力を結合して公開できます。 その後で、この集約デバイスを他の GameInput API 関数に対するフィルターとして使用し、集約デバイスとのやり取り (読み取り値の取得など) を行うことができます。 これはキーボードとマウスの入力に最もよく使用されますが、他のほとんどの種類の入力にも使用できます。

注意

現在のリリースでは、CreateAggregateDevice はまだ実装されていません。

関連項目

GameInput の基礎

GameInput の高度なトピック

GameInput API リファレンス