ホームに戻る
 DirectInputメモ

1、はじめに

DirectInput は入力デバイスを扱います。
具体的にはキーボード、マウス、ジョイスティック等です。

DirectInput の利点

Windowsメッセージを介さないので処理が早い。
DirectInput対応の入力デバイスを用いることでの互換性の向上。
キーボード、マウス、ジョイスティックでの記述の差が少ない。
一部の入力デバイスの入力方法が使用可能になる。

不利な点として、
Windowsを切り離してしまうので、
Windowsと連動する動きは苦手になる。

2、初期化

DirectInput のバージョン8を使います。
DirectInput のライブラリ dinput8.lib と dxguid.lib にリンク。

以下のようにヘッダをインクルード。

#define DIRECTINPUT_VERSION 0x0800

#include <dinput.h>

LPDIRECTINPUT8 g_lpDI;

DirectInput8Create(g_Inst, DIRECTINPUT_VERSION, IID_IDirectInput8, (void**)&g_lpDI, NULL); 

成功すると DI_OK を返す。

3、デバイスの準備

LPDIRECTINPUTDEVICE8  g_lpDIDevice;

// キーボードの場合
g_lpDI->CreateDevice(GUID_SysKeyboard, &g_lpDIDevice, NULL);

// マウスの場合
g_lpDI->CreateDevice(GUID_SysMouse, &g_lpDIDevice, NULL);

4、データフォーマットの作成

// キーボードの場合
g_lpDIDevice->SetDataFormat(&c_dfDIKeyboard);

// マウスの場合
g_lpDIDevice->SetDataFormat(&c_dfDIMouse2);

5、協調レベルの設定

g_lpDIDevice->SetCooperativeLevel(hWnd, DISCL_FOREGROUND | DISCL_NONEXCLUSIVE);

DISCL_FOREGROUND: バックグラウンドに移動したらデバイスを切り離す
DISCL_BACKGROUND: フォアグラウンドでなくともデバイスを受け取れる
DISCL_NONEXCLUSIVE: 非排他アクセス、ウィンドウ操作等は可能
DISCL_EXCLUSIVE: 排他アクセス、ウィンドウ操作はできなくなる

6、プロパティーの設定

相対座標は前回から移動した座標の増減を取得。
絶対座標は起動時から移動した座標の位置を取得。
(起動時の位置は予想できない数値が入っているので注意。)

DIPROPDWORD dipdw;

dipdw.diph.dwSize = sizeof(DIPROPDWORD);
dipdw.diph.dwHeaderSize = sizeof(DIPROPHEADER);
dipdw.diph.dwObj = 0;
dipdw.diph.dwHow = DIPH_DEVICE;
//dipdw.dwData = DIPROPAXISMODE_REL; // 相対座標モード
dipdw.dwData = DIPROPAXISMODE_ABS; // 絶対座標モード

g_lpDIDevice->SetProperty(DIPROP_AXISMODE, &dipdw.diph);

7、デバイスの接続

デバイスが使用可能になります。

if(g_lpDIDevice)g_lpDIDevice->Acquire();

case WM_ACTIVATE:
  if(g_lpDIDevice){
    if(WA_INACTIVE == wParam){
      g_lpDIDevice->Unacquire();
    }
    else{
      g_lpDIDevice->Acquire();
    }
  }
  break;

8、値の取得

// キーボードの場合
#define KEYDOWN(name, key) (name[key] & 0x80) 

char buffer[256]; 

g_lpDIDevice->GetDeviceState(sizeof(buffer), (LPVOID)&buffer); 

if(KEYDOWN(buffer, DIK_RIGHT)){
  // 右が押された
}

// マウスの場合
DIMOUSESTATE2 dims;
 
g_lpDIDevice->GetDeviceState(sizeof(DIMOUSESTATE2), (LPVOID)&dims);

LButton = dims.rgbButtons[0];
RButton = dims.rgbButtons[1];
dX = dims.lX;
dY = dims.lY;
dW = dims.iZ; // ホイール

9、キーボード表

DIK_A 〜 DIK_Z A〜Zキー 
DIK_1 〜 DIK_0 メインキーの数字
(テンキー内の数字ではない) 
DIK_MINUS メインキーのマイナス(−)記号
(テンキー内のマイナス記号ではない) 
DIK_EQUAL メインキーのイコール(=)記号
(テンキー内のイコール記号ではない) 
DIK_SPACE SPACEキー 
DIK_ESCAPE ESCAPEキー 
DIK_TAB TABキー 
DIK_BACK BACK SPACEキー 
DIK_RETURN RETURNキー 
DIK_F1 〜 DIK_F15 ファンクションキーのF1〜F15 
DIK_PRIOR PAGE UPキー 
DIK_NEXT PAGE DOWNキー 
DIK_LCONTROL 左CTRLキー 
DIK_RCONTROL 右CTRLキー 
DIK_LSHIFT 左SHIFTキー 
DIK_RSHIFT 右SHIFTキー 
DIK_LMENU 左ALTキー 
DIK_RMENU 右ALTキー 
DIK_UP DIK_DOWN DIK_RIGHT DIK_LEFT ↑↓→←キー 
DIK_NUMPAD0 〜 DIK_NUMPAD9 テンキーの0〜9 
DIK_MULTIPLY テンキーの* 
DIK_SUBSTRACT テンキーの− 
DIK_ADD テンキーの+ 
DIK_DESIMAL テンキーのピリオド(.) 
DIK_NUMPADENTER テンキーのEnter 
DIK_DEVIDE テンキーのスラッシュ(/) 

10、終了

g_lpDIDevice->Unacquire(); // デバイスの切り離し
g_lpDIDevice->Release();
g_lpDI->Release();

inserted by FC2 system