今回は,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] & 0x80)がtureの時は,クリックしているということになります。
rgbButtonsとかでぐぐったら,左クリック以外の値も分かります。
ということで,DirectInputをとりあえず使う事はこれで出来ると思います。