ホームに戻る
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();