DirectInput(DirectX マウス入力)

今回は,DirectInputについて取り上げてみたいと思います。

DirectInputとは,DirectXで使用する事が出来るマウス入力です。

WindowsAPIでマウス情報が取得したい場合は,イベントでやる他ないと思うので WM_LBUTTONDOWNとかと格闘してください。

そして注意してほしいのは,マウス入力と言っていますが, 今回の例ではクリック情報しか取得しません。DirectInputでマウス座標も拾えますが, 今回はしていないということです。

では,さくっとプログラム書きますね。

// DirectInput用定義  
LPDIRECTINPUTDEVICE8 pDIMouse;  
LPDIRECTINPUT8 pDInput;  
DIMOUSESTATE2 dIMouseState;
     
// 初期化   
pDInput = NULL;      
pDIMouse = NULL;

// DirectInputの初期化 ここから //////////////////////////////////////////////   
DirectInput8Create(GetModuleHandle(NULL), DIRECTINPUT_VERSION, IID_IDirectInput8, (void**)&pDInput, NULL);

pDInput->CreateDevice(GUID_SysMouse, &pDIMouse, NULL);
pDIMouse->SetDataFormat(&c_dfDIMouse2); // マウス用のデータ・フォーマットを設定

HWND hWnd = FindWindow(L”NFWWindow”, NULL);
pDIMouse->SetCooperativeLevel(hWnd, DISCL_NONEXCLUSIVE | DISCL_FOREGROUND);

// デバイスの設定   
DIPROPDWORD diprop;   
diprop.diph.dwSize = sizeof(diprop);   
diprop.diph.dwHeaderSize = sizeof(diprop.diph);   
diprop.diph.dwObj = 0;   
diprop.diph.dwHow = DIPH_DEVICE;   
diprop.dwData = DIPROPAXISMODE_REL; // 相対値モードで設定(絶対値はDIPROPAXISMODE_ABS)   
pDIMouse->SetProperty(DIPROP_AXISMODE, &diprop.diph);

// 入力制御開始   
pDIMouse->Acquire(); // ここでエラーが発生しますが,無視してかまいません。
// DirectInputの初期化 ここまで //////////////////////////////////////////////////////

// DirectInputの更新 ここから //////////////////////////////////////////////////////
// 値の初期化   
dIMouseState.rgbButtons[0] = 0;
// 値の更新
if(FAILED(pDIMouse->GetDeviceState(sizeof(DIMOUSESTATE2), &dIMouseState)))
   pDIMouse->Acquire(); // 1発目や2発目にエラーが出るが無視してよい。
// DirectInputの更新 ここまで //////////////////////////////////////////////////////

あとは,値のチェックの時に,(dIMouseState.rgbButtons[0] & 0×80)がtureの時は,クリックしているということになります。

rgbButtonsとかでぐぐったら,左クリック以外の値も分かります。

ということで,DirectInputをとりあえず使う事はこれで出来ると思います。

comments