DirectInput

DirectInputはマイクロソフトによって開発されたソフトウェアコンポーネント「Microsoft DirectX」のうちのひとつであり、マウス、キーボード、ジョイスティック、ゲームコントローラ等を介してユーザーからの入力情報を収集するためのAPIである。DirectInputはまたゲーム中の入力機器のボタンや座標を特定のアクションに割り当てる「アクションマッピング」のシステムを提供する。さらに「フォースフィードバック」デバイスの入出力を扱う。 マイクロソフトはDirectX 9でXbox 360用コントローラーのためのXInputという新しい入力ライブラリを導入した。 DirectInputとXInputは通常のWin32アプリケーションにも利点がある。 アプリケーションはバックグラウンドでの動作中でも入力機器から情報を入手できる。 フォースフィードバックのような様々なタイプの入力機器を完全にサポートできる。 アクションマッピング機能によりアプリケーションはデータ生成にどのような種類の装置が必要であるかを知ることなく入力データを入手できる。 DirectInputはDirectXライブラリの一部であるが、DirectX 8から大きな変更がない。2005年のMeltdownでのプレゼンテーション[1][リンク切れ]でマイクロソフトは、新しいアプリケーションはキーボードとマウスを制御するのにDirectInputではなくWindowsのメッセージループを活用して、Xbox 360のコントローラーでもDirectInputではなくXInputを使うように推奨した。 DirectInputはDirectXの一部であった。当初は実際はジョイスティックだけをサポートしており、マウスとキーボードの部分は標準Win32 APIの単なるラッパーであった。DirectXバージョン3.0よりキーボードとマウスがサポートされるようになり、ジョイスティックのサポートも改善した。DirectX 5.0ではジョイスティックのサポートを大幅に強化し、フォースフィードバックに対応し、ボタン数が増え、基盤となるデバイスドライバモデルが変更された。マウスでもボタン数が4から8に増えた。DirectX 7.0では長い間待望だった複数のマウスの接続が可能になり、ジョイスティックのように個別に操作できるようになったが、後にリリースされたWindows XPではこの機能が動作しなくなった（Windows 98/MEとDirectX 9の組み合わせでは引き続き動作していた）。DirectX 8.0はアクションマッピングや様々な異なる種類の装置を広くサポートする最後のメジャーバージョンアップとなった。 マイクロソフトは元々DirectInputを全ての入力機器を取り扱う方法として売り込んだが、のちにこの方針は撤回された。以後、マイクロソフトはDirectInputを使ってキーボードとマウスを制御することを推奨しておらず、Xbox 360コントローラーの利用にも新しいXInputを推奨している。というのも、Windows XPではRaw Input APIのサポートが追加され、WM_INPUTというウィンドウメッセージが追加されたが、DirectInputはWM_INPUTのデータを読み取る2つ目のスレッドを内部的に作成するため、DirectInput APIを使用することによって、単にWM_INPUTを直接読み取る場合よりもオーバーヘッドが増加してしまうからである。マウスまたはキーボードのデバイスからデータを読み取る場合は、DirectInputを使用する利点はない。高解像度マウスの移動データが必要ない場合はWM_MOUSEMOVEを、高精度の制御が必要なFPSゲームでのエイミング操作のようにパフォーマンス最適化の観点から高解像度マウスのサポートが求められる場合はWM_INPUTを用いることが推奨されている。 XInputは「次世代」コントローラーのためのAPIであり、Xbox 360の発売と共に導入され、Xbox 360コントローラーの全ての機能がWindows XP SP1以上で利用できるようになった。XInputはDirectInputよりもプログラムが劇的に簡単になる利点がある。XInputはDirectX 9以上から利用できる。 DirectInputはDirectX 8から大きな変更が無く、XInputは後のDirectX 9で導入され、2つのAPIの現状と将来には若干の混乱がある。現在はお互いにない特徴があり、そしていずれもDirectX 10で大きな変更はない。 Xbox 360用コントローラーとマイクロソフトのデフォルトのWindowsドライバの組み合わせにおいてDirectInputを使う場合、XInputと比較して以下の制約がある。 左右のトリガーは単一のデジタルな方向として動作し、独立したアナログの軸としては動作しない。 振動機能は利用できない。 ヘッドセットデバイスの確認ができない。 MSDNによると、以下のような説明および解決策が記載されている。 DirectInput の左右のトリガーの組み合わせは、意図的なものです。ゲームでは、DirectInput デバイスとユーザーとの対話操作がない場合、このデバイスの軸は常に中央に配置されると想定しています。ただし、トリガーが保持されない場合、Xbox 360 コントローラーは中心ではなく最小値を登録するように設計されていました。したがって、以前のゲームはユーザーの対話操作を想定しています。 この解決策とは、トリガーを組み合わせて、あるトリガーを正の方向に設定し、もう 1 つのトリガーを負の方向に設定するというものでした。それによって、DirectInput に"制御"が中央にあることをユーザーの対話操作で示すことがなくなります。 これはしかしながら、デュアルアナログスティックのあるゲームパッドやハンドルコントローラーなどのような様々なDirectInputコントローラーが既にトリガーやペダルに個々に割り当て済みであるという事実を無視していた。しかも多くのDirectInputデバイスには振動機能も搭載されていた。Xbox 360用コントローラーで振動機能をサポートし、デッドゾーンの検知や、(オプションとして)独立したトリガーをDirectInput経由で利用できる、XBCDというドライバが存在している。これはDirectInputとXInputのAPIの違いによるものというよりはむしろ、マイクロソフトが提供するXbox 360用コントローラーのドライバは「意図的に」DirectInputでの機能を制限していることを示している。 現在XInputのAPIはDirectInputにはない制約もある。 次世代のコントローラーのみをサポートする。基本的にWindows用のドライバがあるXbox 360用のコントローラーに制限される。旧式のWindows用のコントローラーはサポートしていない。 最大同時接続数4台。これはXboxからWindowsに持ち込まれた制約である。今のところ4つのコントローラーを必要とするPC用ゲームはまずないが、DirectInputにはこのような制限が無く、不合理な制限と考えられる。 キーボード、マウス及びマウス型デバイスの非サポート。DirectInputはこれらのデバイスに対しては推奨されないものとするマイクロソフトの意向を反映しているが、DirectInputでこれらのデバイスを利用すること自体は可能である。 1コントローラーあたり、アナログ4軸、10ボタン、デジタル8方向のみをサポートする。XInputがサポートする軸とボタンの数はXbox 360用コントローラーと直接対応しているためである。対してDirectInputはアナログ8軸、128ボタン、フルレンジのPOV (ハットスイッチ) をサポートする。 DirectInputは従来から存在する規格のため、対応するドライバーが用意されているデバイスも豊富だが、XInputは後発のため、主要な対応デバイスとしてはXbox 360用の純正コントローラーおよびXbox One用の純正コントローラーのみである。ただし、サードパーティー製の各種コントローラーもDirectInput/XInput両対応の製品がいくつか発売されている 。 Windows 8で導入されたWindowsストアアプリでは、XInput 1.4のみが使用可能であり、デスクトップアプリ向けのXInput (1.1/1.2/1.3, 9.1.0) およびDirectInputは使用できない。XInput 1.4ではオーディオヘッドセットの問い合わせ機能が追加されている。 2022年現在、DirectInputは過去の技術とみなされているが、コミュニティベースでの試みとして、フライトシミュレーターをForce feedback API対応ジョイスティックで使用可能にする、XPForce プロジェクトが存在する。 [脚注の使い方] ^ Raw Input Overview - Win32 apps | Microsoft Learn ^ WM_INPUT message (Winuser.h) - Win32 apps | Microsoft Learn ^ Taking Advantage of High-Definition Mouse Movement - Win32 apps | Microsoft Learn ^ 高解像度マウス動作の使用 | Microsoft Learn ^ XInput と DirectInput | Microsoft Docs ^ XInput and DirectInput - Win32 apps | Microsoft Docs ^ 英語版の原文では「by design」（仕様）となっている。 ^ XINPUT and Windows 8 | Games for Windows and the DirectX SDK blog ^ 幅広いゲームが楽しめる、USBゲームパッド - JC-U3613Mシリーズ ^ F310 Gamepad - Logicool ^ XInput Versions - Win32 apps | Microsoft Docs ^ XInputGetAudioDeviceIds function (xinput.h) - Win32 apps | Microsoft Docs ^ XPForce force-feedback will be coming to FS2020! Microsoft DirectX