キーボード、マウス、および DirectX でコント ローラーの入力Keyboard, mouse, and controller input in DirectX

キーボード、マウス、およびゲーム コント ローラーすべて Windows Mixed Reality デバイス用の入力の便利なフォームを指定できます。Keyboards, mice, and game controllers can all be useful forms of input for Windows Mixed Reality devices. Bluetooth キーボードとマウスの両方がサポート、HoloLens でアプリのデバッグで、または、代替形式の入力として使用します。Bluetooth keyboards and mice are both supported on HoloLens, for use with debugging your app or as an alternate form of input. Windows Mixed Reality は、マウス、キーボード、およびゲーム コント ローラーとなってきた、norm - Pc に接続されている、イマーシブ ヘッドセットもサポートします。Windows Mixed Reality also supports immersive headsets attached to PCs - where mice, keyboards, and game controllers have historically been the norm.

HoloLens、ペアに、デバイスの Bluetooth キーボードでキーボード入力を使用して、または、Windows Device Portal を使用して、仮想入力を使用します。To use keyboard input on HoloLens, pair a Bluetooth keyboard to your device or use virtual input via the Windows Device Portal. Windows Mixed Reality イマーシブ ヘッドセット ソックスを着けずにいるときにキーボード入力を使用するには、デバイスに配置するか、Windows キー + Y キーの組み合わせを使用して、複合現実に入力フォーカスを割り当てます。To use keyboard input while wearing a Windows Mixed Reality immersive headset, assign input focus to mixed reality by putting on the device or using the Windows Key + Y keyboard combination. HoloLens の対象としたアプリが接続されているこれらのデバイスなし機能を提供する必要がありますに留意してください。Keep in mind that apps intended for HoloLens must provide functionality without these devices attached.

注意

この記事のコード スニペットは現在の使用を示すC++/CX ではなく c++ 17 に準拠していませんC++/WinRT で使用するため、 C++ holographic プロジェクト テンプレートします。The code snippets in this article currently demonstrate use of C++/CX rather than C++17-compliant C++/WinRT as used in the C++ holographic project template. 概念は、同等のC++/WinRT のプロジェクトがコードに変換する必要があります。The concepts are equivalent for a C++/WinRT project, though you will need to translate the code.

CoreWindow 入力イベントをサブスクライブします。Subscribe for CoreWindow input events

キーボード入力Keyboard input

Windows Holographic のアプリケーション テンプレートで他の UWP アプリと同じようにキーボード入力のイベント ハンドラーが含まれます。In the Windows Holographic app template, we include an event handler for keyboard input just like any other UWP app. アプリは、Windows Mixed Reality で同じようにキーボード入力データを消費します。Your app consumes keyboard input data the same way in Windows Mixed Reality.

AppView.cpp: からFrom AppView.cpp:

// Register for keypress notifications.
   window->KeyDown +=
       ref new TypedEventHandler<CoreWindow^, KeyEventArgs^>(this, &AppView::OnKeyPressed);

    …

   // Input event handlers

   void AppView::OnKeyPressed(CoreWindow^ sender, KeyEventArgs^ args)
   {
       //
       // TODO: Respond to keyboard input here.
       //
   }

仮想キーボード入力Virtual keyboard input

没入型のデスクトップ ヘッドセットには、Windows によって、没入型のビューに表示される仮想キーボードもサポートできます。For immersive desktop headsets, you can also support virtual keyboards rendered by Windows over your immersive view. これをサポートするアプリを実装できますCoreTextEditContextします。To support this, your app can implement CoreTextEditContext. これには、Windows 仮想キーボード正しくテキストが参加できるように、アプリ側でレンダリングされるテキスト ボックスの状態を理解することができます。This lets Windows understand the state of your own app-rendered text boxes, so the virtual keyboard can correctly contribute to the text there.

CoreTextEditContext サポートの実装の詳細については、次を参照してください。、 CoreTextEditContext サンプルします。For more information on implementing CoreTextEditContext support, see the CoreTextEditContext sample.

マウス入力Mouse Input

UWP CoreWindow 入力イベントのハンドラーを使用してもう一度、マウスの入力を使用することもできます。You can also use mouse input, again via the UWP CoreWindow input event handlers. 同じように押されたジェスチャでマウスのクリックをサポートするために、Windows Holographic のアプリケーション テンプレートを変更する方法を次に示します。Here's how to modify the Windows Holographic app template to support mouse clicks in the same way as pressed gestures. したらこの変更は、イマーシブ ヘッドセット デバイスを装着しているときにマウスのクリックにキューブが再配置します。After making this modification, a mouse click while wearing an immersive headset device will reposition the cube.

サイト サーバー、UWP アプリできますを使用して、マウスの生データはお客様 xy のところを取得します。 に注意してください、 MouseDevice API。Note that UWP apps can also get raw XY data for the mouse by using the MouseDevice API.

AppView.h で新しい OnPointerPressed ハンドラーを宣言することで開始します。Start by declaring a new OnPointerPressed handler in AppView.h:

protected:
       void OnPointerPressed(Windows::UI::Core::CoreWindow^ sender, Windows::UI::Core::PointerEventArgs^ args);

AppView.cpp では、SetWindow にこのコードを追加します。In AppView.cpp, add this code to SetWindow:

// Register for pointer pressed notifications.
   window->PointerPressed +=
       ref new TypedEventHandler<CoreWindow^, PointerEventArgs^>(this, &AppView::OnPointerPressed);

ファイルの下部にある OnPointerPressed のこの定義を配置します。Then put this definition for OnPointerPressed at the bottom of the file:

void AppView::OnPointerPressed(CoreWindow^ sender, PointerEventArgs^ args)
   {
       // Allow the user to interact with the holographic world using the mouse.
       if (m_main != nullptr)
       {
           m_main->OnPointerPressed();
       }
   }

イベント ハンドラーを追加しましたが、テンプレートの主なクラスに、パススルーします。The event handler we just added is a pass-through to the template main class. このパススルーをサポートするために、メイン クラスを変更してみましょう。Let's modify the main class to support this pass-through. ヘッダー ファイルには、このパブリック メソッドの宣言を追加します。Add this public method declaration to the header file:

// Handle mouse input.
       void OnPointerPressed();

このプライベート メンバー変数も必要があります。You'll need this private member variable, as well:

// Keep track of mouse input.
       bool m_pointerPressed = false;

最後に、メイン クラスのマウス クリックをサポートする新しいロジックと共に更新されます。Finally, we will update the main class with new logic to support mouse clicks. このイベント ハンドラーを追加することで開始します。Start by adding this event handler. クラス名を更新してください。Make sure to update the class name:

void MyHolographicAppMain::OnPointerPressed()
   {
       m_pointerPressed = true;
   }

ここで、Update メソッドでは、このポインターの姿勢を取得するための既存のロジックを置き換えます。Now, in the Update method, replace the existing logic for getting a pointer pose with this:

SpatialInteractionSourceState^ pointerState = m_spatialInputHandler->CheckForInput();
   SpatialPointerPose^ pose = nullptr;
   if (pointerState != nullptr)
   {
       pose = pointerState->TryGetPointerPose(currentCoordinateSystem);
   }
   else if (m_pointerPressed)
   {
       pose = SpatialPointerPose::TryGetAtTimestamp(currentCoordinateSystem, prediction->Timestamp);
   }
   m_pointerPressed = false;

再コンパイルし、再デプロイします。Recompile and redeploy. マウス クリックがようになりましたの位置を変更、キューブには、HoloLens、イマーシブ ヘッドセット - bluetooth マウスが接続されているとすることがわかります。You should notice that the mouse click will now reposition the cube in your immersive headset - or HoloLens with bluetooth mouse attached.

ゲーム コント ローラーのサポートGame controller support

ゲーム コント ローラーには、楽しく魅力的な Windows Mixed Reality エクスペリエンスを制御するユーザーを許可する際の便利な方法を指定できます。Game controllers can be a fun and convenient way of allowing the user to control an immersive Windows Mixed Reality experience.

ゲーム コント ローラーのサポートを Windows Holographic のアプリ テンプレートに追加するのには、最初の手順では、メインのファイルのヘッダーのクラスに次のプライベート メンバー宣言を追加します。The first step in adding support for game controllers to the Windows Holographic app template, is to add the following private member declarations to the header class for your main file:

// Recognize gamepads that are plugged in after the app starts.
       void OnGamepadAdded(Platform::Object^, Windows::Gaming::Input::Gamepad^ args);
// Stop looking for gamepads that are unplugged.
       void OnGamepadRemoved(Platform::Object^, Windows::Gaming::Input::Gamepad^ args);
Windows::Foundation::EventRegistrationToken                     m_gamepadAddedEventToken;
       Windows::Foundation::EventRegistrationToken                     m_gamepadRemovedEventToken;
// Keeps track of a gamepad and the state of its A button.
       struct GamepadWithButtonState
       {
           Windows::Gaming::Input::Gamepad^ gamepad;
           bool buttonAWasPressedLastFrame = false;
       };
       std::vector<GamepadWithButtonState>                             m_gamepads;

Gamepad イベント、および現在接続されている、主要なクラスのコンス トラクターで、ゲームパッドを初期化します。Initialize gamepad events, and any gamepads that are currently attached, in the constructor for your main class:

// If connected, a game controller can also be used for input.
   m_gamepadAddedEventToken = Gamepad::GamepadAdded +=
       ref new EventHandler<Gamepad^>(
           bind(&$safeprojectname$Main::OnGamepadAdded, this, _1, _2)
           );
m_gamepadRemovedEventToken = Gamepad::GamepadRemoved +=
       ref new EventHandler<Gamepad^>(
           bind(&$safeprojectname$Main::OnGamepadRemoved, this, _1, _2)
           );
for (auto const& gamepad : Gamepad::Gamepads)
   {
       OnGamepadAdded(nullptr, gamepad);
   }

メイン クラスには、これらのイベント ハンドラーを追加します。Add these event handlers to your main class. クラス名を更新してください。Make sure to update the class name:

void MyHolographicAppMain::OnGamepadAdded(Object^, Gamepad^ args)
   {
       for (auto const& gamepadWithButtonState : m_gamepads)
       {
           if (args == gamepadWithButtonState.gamepad)
           {
               // This gamepad is already in the list.
               return;
           }
       }
       m_gamepads.push_back({ args, false });
   }
void MyHolographicAppMain::OnGamepadRemoved(Object^, Gamepad^ args)
   {
       m_gamepads.erase(
           std::remove_if(m_gamepads.begin(), m_gamepads.end(), [&](GamepadWithButtonState& gamepadWithState)
               {
                   return gamepadWithState.gamepad == args;
               }),
           m_gamepads.end());
   }

最後に、コント ローラーの状態の変更を認識する入力のロジックを更新します。Finally, update the input logic to recognize changes in controller state. ここでは、マウス イベントを追加するため、上のセクションで説明した同じ m_pointerPressed 変数を使用します。Here, we use the same m_pointerPressed variable discussed in the section above for adding mouse events. SpatialPointerPose をチェックする前に、Update メソッドを追加します。Add this to the Update method, just before where it checks for the SpatialPointerPose:

// Check for new input state since the last frame.
   for (auto& gamepadWithButtonState : m_gamepads)
   {
       bool buttonDownThisUpdate = ((gamepadWithButtonState.gamepad->GetCurrentReading().Buttons & GamepadButtons::A) == GamepadButtons::A);
       if (buttonDownThisUpdate && !gamepadWithButtonState.buttonAWasPressedLastFrame)
       {
           m_pointerPressed = true;
       }
       gamepadWithButtonState.buttonAWasPressedLastFrame = buttonDownThisUpdate;
   }
// For context.
   SpatialInteractionSourceState^ pointerState = m_spatialInputHandler->CheckForInput();
   SpatialPointerPose^ pose = nullptr;
   if (pointerState != nullptr)
   {
       pose = pointerState->TryGetPointerPose(currentCoordinateSystem);
   }
   else if (m_pointerPressed)
   {
       pose = SpatialPointerPose::TryGetAtTimestamp(currentCoordinateSystem, prediction->Timestamp);
   }
   m_pointerPressed = false;

メイン クラスをクリーンアップする場合、イベントの登録を解除することを忘れないでください。Don't forget to unregister the events when cleaning up the main class:

if (m_gamepadAddedEventToken.Value != 0)
   {
       Gamepad::GamepadAdded -= m_gamepadAddedEventToken;
   }
   if (m_gamepadRemovedEventToken.Value != 0)
   {
       Gamepad::GamepadRemoved -= m_gamepadRemovedEventToken;
   }

再コンパイルして再デプロイします。Recompile, and redeploy. アタッチ、ゲーム コント ローラーとペアにまたはとそれを使用して、回転するキューブの位置を変更するようになりましたことができます。You can now attach, or pair, a game controller and use it to reposition the spinning cube.

キーボードとマウス入力に関する重要なガイドラインImportant guidelines for keyboard and mouse input

Microsoft HoloLens – これは主に Windows Mixed Reality 対応の PC で使用できると – 自然なユーザー入力に依存しているデバイス上のこのコードの使用方法の主な相違点があります。There are some key differences in how this code can be used on Microsoft HoloLens – which is a device that relies primarily on natural user input – versus what is available on a Windows Mixed Reality-enabled PC.

  • キーボードまたはマウスが存在する入力を利用できません。You can’t rely on keyboard or mouse input to be present. すべてのアプリの機能は、視線、ジェスチャ、音声入力と作業する必要があります。All of your app's functionality must work with gaze, gesture, and speech input.
  • Bluetooth キーボードが接続されている場合は、アプリがありますを要求する任意のテキストのキーボード入力を有効にすると便利ができます。When a Bluetooth keyboard is attached, it can be helpful to enable keyboard input for any text that your app might ask for. たとえば、音声入力の優れた追加条項を指定できます。This can be a great supplement for dictation, for example.
  • アプリを設計する際、WASD (など) に依存しないようにし、マウスがゲームのコントロールを検索します。When it comes to designing your app, don’t rely on (for example) WASD and mouse look controls for your game. HoloLens は、ルームまでわざわざ行かずに、ユーザーに適しています。HoloLens is designed for the user to walk around the room. この場合、ユーザーは、カメラを直接制御します。In this case, the user controls the camera directly. 移動/参照コントロールで部屋のカメラを促進するためのインターフェイスには、同じエクスペリエンスを提供しません。An interface for driving the camera around the room with move/look controls won't provide the same experience.
  • キーボード入力には、ユーザーがキーボードを使用する必要はありませんので特にアプリやゲームのエンジンのデバッグの側面を制御する優れた方法を指定できます。Keyboard input can be an excellent way to control the debugging aspects of your app or game engine, especially since the user will not be required to use the keyboard. 接続には、同じ as CoreWindow イベント Api で、使用しているです。Wiring it up is the same as you're used to, with CoreWindow event APIs. このシナリオでは、デバッグ セッション中に"debug 入力専用"モードにキーボード イベントをルーティングするアプリを構成する方法を実装することもできます。In this scenario, you might choose to implement a way to configure your app to route keyboard events to a "debug input only" mode during your debug sessions.
  • Bluetooth コント ローラーがうまく動作します。Bluetooth controllers work as well.

関連項目See also