次の方法で共有


DirectInput ゲーム コントローラーのコントロール パネルを拡張する

このトピックでは、Microsoft DirectInput ゲーム コントローラー コントロール パネルのプロパティ シートを作成する方法について説明します。

DirectInput コントロール パネルについて

DirectInput では、ゲーム パッド、ジョイスティック、フォース フィードバック デバイスなどのゲーム コントローラーがサポートされます。 Microsoft DirectX 5.0 以降のバージョンでは、DirectInput には joy.cpl と呼ばれる新しいゲーム コントローラー コントロール パネルが用意されています。 コントロール パネルでは、各コントローラーに表示されるプロパティ シートをそのコントローラーに固有のプロパティ ページに置き換えることができる拡張性を備えています。 これは、これらのプロパティ シートに関する情報を含む DLL を作成することによって行われます。 この DLL は、DirectInput コントロール パネルによって呼び出される COM インターフェイスを公開します。

ゲーム コントローラーのハードウェア ベンダーは、別のコントロール パネルを作成するのではなく、この拡張機能を使用して、ゲーム コントローラー用にカスタマイズされたプロパティ シートを提供することをお勧めします。 これにより、ユーザーは 1 つのコントロール パネルを開いて、ゲーム コントローラーを構成してテストできるようになります。

DirectInput コントロール パネルのアーキテクチャ

このセクションでは、DirectInput コントロール パネルの拡張可能なプロパティ シートの基本構造について説明します。

ゲーム コントローラー コントロール パネル

DirectInput コントロール パネルの基本的なアーキテクチャは、DirectInput ゲーム コントローラー コントロール パネル、IDIGameCntrlPropSheet COM インターフェイスをサポートする抽象化レイヤー ライブラリ、および各ゲーム コントローラー プロパティ シートの COM オブジェクトで構成されます。

Note

"オブジェクト" という単語は、COM インターフェイスのメソッドが C++ などのオブジェクト指向プログラミング言語を通じて呼び出されない場合でも、これらのメソッドをサポートするために CreateInstance によって作成されるエンティティを表します。 "シート" という単語は、ページが挿入されるダイアログを表します。 "ページ" という単語は、[プロパティ シート] ダイアログのコンテンツ ダイアログを表します。

DirectInput コントロール パネルは DirectInput と直接連携し、DirectInput はデバイス ドライバーと直接連携します。 この副産物として、アプリケーションがバックグラウンドにあるときでも、DirectInput コントロール パネルは入力デバイスにアクセスできます。

既定のアナログ デバイス プロパティ シート

独自のコントロール パネルを作成しないハードウェア ベンダーは、Gcdef.dll によって提供される既定のアナログ デバイス プロパティ シートのサービスを使用します。 HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\MediaProperties\PrivateProperties\Joystick\OEM\<CONTROLLER_NAME> エントリの下のレジストリに ConfigCLSID キーがないコントローラーは、この既定のプロパティ シートを使用します。 このプロパティ シートには、次の 2 つのページが含まれています。

  • テスト: このページでは、デバイスが正しく応答していることを示します。 デバイス属性に関連付けられているレジストリ設定のグラフィカルな表現が返され、ユーザーはそれらを表示できるようになります。

  • 設定: このページを使用すると、ユーザーはデバイスに関する特定の情報をシステムに書き込むことができます。 調整用やラダーまたはペダル用のサービスが提供されます。

Windows との統合

プロパティ シート ページは COM オブジェクトであるため、Windows に登録する必要があります。 これは、INF ファイルまたは DirectInput の IDirectInputJoyConfig8 インターフェイスを使用して実行できます。 サンプル INF ファイルは、DirectX Driver Development Kit (DDK) のサンプル プロパティ シートの一部です。

プロパティ シート ページを登録するには:

  1. GuidGen ツール (Microsoft Windows SDK に含まれています) を使用して、プロパティ シートの CLSID を作成します (これは、前述の ConfigCLSID エントリに入力したものと同じです)。 これはデバイス固有のプロパティ シート GUID であり、コード内の GUID と同じである必要があります。

  2. この新しい GUID を使用して、My Computer\HKEY_CLASSES_ROOT\CLSID の下のレジストリに新しいキーを作成します。 {B9EA2BE1-E8E9-11D0-9880-00AA0044480F} のようになります。

  3. そのキー内に、InProcHandler32 および InProcServer32 という名前のサブキーを作成します。

  4. InProcServer32 キー内で、プロパティ シート DLL の場所と名前を反映するように既定のエントリを編集します。

デバイスもゲーム デバイスとして正しく登録されている必要があります。 これは、DirectInput または INF ファイルを使用して行うことができます。

デバイスを登録するには:

  1. レジストリ キー My Computer\HKEY_LOCAL_MACHINE\System\CurrentControlSet\control\MediaProperties\PrivateProperties\Joystick\OEM に、デバイスのキーを入力します。 このキー名をデバイスの OEM 名と同じにします。

  2. 次のエントリを作成します。

    キー値 キー値の種類 キー値の種類の内容
    ConfigCLSID [Key] "{your property sheet CLSID}"
    OEMName [Key] "デバイスの製品名"

    Note

    これら 2 つのエントリは、開始するために最低限必要なものです。 使用可能なすべてのエントリとそれに関連するサービスの詳細については、Windows SDK を参照してください。

DirectInput コントロール パネルの要点

このセクションでは、DirectInput コントロール パネルの概念とコンポーネントについて説明し、独自のデバイス固有のプロパティ シートの実装を開始するのに役立つ情報を提供します。

ファイルとビルド環境

Windows ソフトウェア開発キット (SDK) が必要です。 dinputd.h ヘッダー ファイルには、必要なインターフェイス、構造体、クラス定義、およびエラーが用意されています。 すべてのレジストリ アクセスには、DirectInput の IDirectInputJoyConfig8 インターフェイスを使用します。 プロパティ ページで DirectInput を使用する場合は、関連付けられている Windows SDK ファイルも使用する必要があります。 DirectInput コントロール パネル内のすべての構造体は、8 バイトの境界にパックされます。 プロパティ シートが 8 バイト境界で構造体をパックしていることを確認します。

Note

コントロール パネルをテストするときは、プライマリ ディスプレイが 640 x 480 ピクセルの解像度に設定されているシステムでテストしてください。 この低い解像度でもすべてのコントロールが表示されることを確認してください。

プロパティ シートの作成

この例は、DirectInput のさまざまな側面を示しており、独自のカスタム プロパティ シートの出発点として適しています。

独自のプロパティ シートを作成する

カスタム プロパティ シートを最初から作成するプロセスは、比較的簡単です。

  1. プロパティ ページを識別するための GUID を作成します。

    • GuidGen ツール (Windows SDK に含まれている) を使用して、プロパティ ページの GUID を作成します (ページ数に関係なく、1 つだけ)。 これをアプリケーション固有のインクルード ファイルで定義します。
    • 必要な DllGetClassObject と DllCanUnloadNow を作成します。
    • dinputd.h で定義されている COM ClassFactory の実装を作成します。
    • IDIGameCntrlPropSheet インターフェイスの実装を作成します。
    • RegEdit を使用して、定義済みの GUID を My Computer\HKEY_CLASSES_ROOT\CLSID キーに追加します。 次に、キー InProcHandler32 と InProcServer32 を自分のキーに追加します。
    • プロパティ シート DLL の場所を指すように InProcServer32 エントリの (既定の) エントリを変更します。 たとえば、"C:\my_device\my_propertysheet.dll" のようになります。 この例では、ProgID エントリを示します。 これは必要ありませんが、多くの場合、その GUID に存在するモジュールに関する情報を格納するために使用されます。
  2. Windows アプリケーションの場合と同様に、ダイアログ テンプレートとダイアログ プロシージャを作成します。

    Note

    プロパティ シートのテスト コンテナーを、独立したダイアログ ボックスとしてページを起動するウィンドウとして記述できます。 この時点で、必要な既存のコントロール パネルを DirectInput コントロール パネルに変換することもできます。

  3. DIGCPAGEINFO 構造体と DIGCSHEETINFO 構造体を設定し、IDIGameCntrlPropSheet::GetPageInfoIDIGameCntrlPropSheet::GetSheetInfo の実装でその情報をそれぞれ返します。

プロパティ シート ページの生成は、PropertySheet 関数を使用して行われます。 この関数のすべての動作は、プロパティ シート ページに固有です。 たとえば、プロパティ シート ページには、受け取った最大のダイアログ テンプレートが反映されます。 ユーザーが 1 つのページを作成し、その関連するテンプレートが非常に小さい場合、これは結果のダイアログのサイズに直接反映されます。

ダイアログ テンプレートは、視覚的な配置とページ上のコントロールの中央揃えを考慮する際にも重要です。 たとえば、ユーザーがページの中央に配置するように指定された項目を含む 2 つのページを作成する場合を考えてみましょう。 中央に配置する 1 つの項目は、幅が 200 ダイアログ単位 (DLU) で、もう 1 つは 100 単位です。 このような場合、後者の項目はページの中央に配置されません。 代わりに、コントロールがテンプレートの中央に配置され、狭い方のページの幅に空白 (灰色で表示される場合もあり) が追加されます。 すべて使用していない場合でも、同じサイズのダイアログ テンプレートを作成する必要があります。 (PropertySheet 関数の詳細については、Windows SDK のドキュメントを参照してください)。

プロパティ シートのテスト

プロパティ シート ページのテスト中に、DirectInput と、DirectInput コントロール パネルの両方のデバッグ バージョンを実行します。 DirectX コンポーネントは、デバッグ ウィンドウ/ターミナルに便利なエラーと警告メッセージを発行するように設計されています。

コントロール パネル アプリケーションのデバッグは難しい場合があります。 Microsoft Developer Studio 5.0 以降でカスタム プロパティ シート ページをデバッグするには、次の手順に従います (他のコンパイラの動作も同様です)。

  1. [プロジェクト] メニューで [設定] を選択します。

  2. [デバッグ] タブを選択します。

  3. デバッグ セッションの実行可能ファイルには、「C:\WINDOWS\SYSTEM32\RUNDLL32.EXE」と入力します (C:\WINDOWS が Windows ディレクトリであると仮定しています)。

  4. プログラム引数には、「shell32.dll,Control_RunDLL c:\windows\system32\joy.cpl」と入力します。 ここでも、C:\WINDOWS が Windows ディレクトリであると仮定しています。 引数は大文字と小文字が区別されるため、示されているとおりに正確に入力する必要があります。

  5. ブレークポイントを設定します。

  6. ビルド メニューで、[デバッグの開始][移動] の順に選択します。

これで、カスタム プロパティ シート ページをデバッグする準備ができました。