マウスの状態取得(DirectInput)

   

マウスの状態取得

「マウスの状態を取得する」のはWindowsプログラムでは必須となりますが、通常は「マウスでクリックされた」ところから扱うことがほとんどです。
今回もDirectInputを使った実装方法ついて書きます。

 

DirectInputでマウスから取得できる情報

DirectInputを使ったマウスデバイスから取得できる情報には

  • マウスポインタの移動量X
  • マウスポインタの移動量Y
  • マウスポインタの移動量Z(2016時点でZはまだ出番はなさそうですね)
  • マウス左ボタンの押下状態
  • マウス右ボタンの押下状態
  • マウス中ボタンの押下状態(最近のホイールマウスのホイールを押してもここは反応しません。3ボタンマウスというマウスのときに使用されるものです)

があります。

 

実装してみる

実装したコード

 

 

コードの説明

9行目から15行目

ヘッダファイルのインクルード文と使用するライブラリファイルの指定です。
(キーボードの時にも書いたところですが、”DIRECTINPUT_VERSION”の#define文がある行は、#include <dinput.h>より”前”に書く必要があります)

 

29行目から35行目

ここは、使用するDirectInputのオブジェクト(g_pDInput)と、DirectInputのマウスデバイスオブジェクト(g_pDIMouse)の宣言を行っています。
また、マウスデバイスから取得したマウス状態を保持するグローバル変数(g_zdiMouseState)も宣言しています。

 

39行目から139行目

ここはちょっと長いです。

関数が4つ実装されています。

  • bool InitDInput(HINSTANCE hInstApp, HWND hWnd)
    → DirectInputの初期化処理呼び出し用の関数
  • bool ReleaseDInput(void)
    → DirectInputの終了処理呼び出し用の関数
  • bool InitDInputMouse(HWND hWnd)
    → DirectInputのマウスデバイス用の初期化処理呼び出し用関数
  • bool ReleaseDInputMouse()
    → DirectInputのマウスデバイス用の解放処理呼び出し用関数

これらの関数はそれぞれ、下記の追加部分から呼び出されます。

155行目から162行目

ここが、DirectInputでマウス状態を取得する「実体」になります。

DirectInputのGetDeviceState()を呼び出すことで、マウスデバイスが現在持っている状態を取得します。

 

198行目から201行目

ここは、ウィンドウメッセージの’WM_DESTROY’から呼び出されたときの処理です。
プログラム自体が終了する箇所なので、DirectInput関係のオブジェクトも破棄して、プログラムが終了する準備をします。

 

277行目から280行目

ここは、WinMain関数(Win32プログラムのエントリポイント)が呼び出され、メッセージループに入るまでの処理です。

「プログラムの初期化処理」で、ここで

  • DirectInputオブジェクトの生成と初期化
    (InitDInput()関数の呼び出し)
  • DirectInputマウスデバイスオブジェクトの生成と初期化
    (InitDInputMouse()関数の呼び出し)

を行っておきます。

 

293行目から295行目

ここはメッセージループ本体(ほんとにループしている個所です)にGetMouseState関数を呼び出すことで、155行目から162行目の処理が実行されます。

DirectInputのGetDeviceState()が呼び出されるので、ここでマウス状態の取得処理が行っていることになります。

 

まとめ

このプログラムを動かしてみると、なんとなく「マウスの情報をデバッグ出力(Visual Studioの[出力]タブ)に出力しているだけ」に見えます。

ただ、このプログラムを実行させて、マウスの左ボタンと右ボタンを同時に押してみてください。

通常のWindowsプログラムでは、マウスの左ボタンと右ボタンを同時に押すと、たいてい「左ボタンが押された」「右ボタンが押された」は判りますが、「左ボタンと右ボタンが両方押されている」は判りません。

DirectInputを使ったこのプログラムの場合は、マウスの状態をそのまま取得するだけのようですが、「そのまま取得している」ということは、扱い方次第で

  • どちらのボタンを先に押して
  • どのくらい両方のボタンが押されて
  • どちらのボタンを先に離したか

までを知ることができます。

 

 

 - 未分類