DirectX
能動的にホイールの状態を取得する


HomeProgramming TipsDirectX Tips [DX8-001]

マウスホイール情報を得るには、通常は受動的に WM_MOUSEWHEEL を補足します。
自分にフォーカスがない状態でホイール情報を取得しようとすると、グローバルフックという技法を用いるのですが、
相性問題などが発生しやすく気軽には実装できません。

そこで、OnIdle() などで毎回マウスの状態を確認することで確実に状態を捕捉します。
但し、ホイールだけは通常の API でサポートされていないため、取得が大変です。
このようなときは DirectInput API を使用します。

 ダウンロード : ホイール取得サンプル(2005/03/20) 


■ 定義

#ifndef DIRECTINPUT_VERSION
#define DIRECTINPUT_VERSION     0x0800
#endif

#include <dinput.h>

#pragma comment(lib, "dxguid.lib")
#pragma comment(lib, "dinput8.lib")


■ 変数宣言

    LPDIRECTINPUT8          m_pDInput;
    LPDIRECTINPUTDEVICE8    m_pDIDevice;


■ 初期化(コンストラクタ)

    m_pDInput   = NULL;
    m_pDIDevice = NULL;


■ 初期化(InitInstance 推奨)

    // DirectInput8 インターフェースの取得
    if FAILED(DirectInput8Create(
        GetModuleHandle(NULL),
        DIRECTINPUT_VERSION,
        IID_IDirectInput8,
        (LPVOID*)&m_pDInput,
        NULL
    )){
        // DirectInput8 がありません。
        return FALSE;
    }

    // マウスデバイスの取得
    if FAILED(m_pDInput->CreateDevice(GUID_SysMouse, &m_pDIDevice, NULL)){
        // マウスが無いかも
        return FALSE;
    }

    // データ形式の設定
    if FAILED(m_pDIDevice->SetDataFormat(&c_dfDIMouse2)){
        // 普通じゃないマウスかも
        return FALSE;
    }

    // 強調モードの設定
    if FAILED(m_pDIDevice->SetCooperativeLevel(
        GetSafeHwnd(),
        DISCL_BACKGROUND | DISCL_NONEXCLUSIVE
    )){
        // 既に排他モードでどこかに取られているかも
        return FALSE;
    }

    // バッファサイズを設定
    DIPROPDWORD diprop;
    diprop.diph.dwSize       = sizeof(diprop);
    diprop.diph.dwHeaderSize = sizeof(diprop.diph);
    diprop.diph.dwObj        = 0;
    diprop.diph.dwHow        = DIPH_DEVICE;
    diprop.dwData            = 1000;
    m_pDIDevice->SetProperty(DIPROP_BUFFERSIZE, &diprop.diph);

    // ポーリング開始
    m_pDIDevice->Acquire();


■ ホイール情報の取得

    //  バッファリングデータの取得
    while (TRUE){

        DIDEVICEOBJECTDATA od;
        DWORD dwItem = 1;

        HRESULT hr = m_pDIDevice->GetDeviceData(sizeof(od), &od, &dwItem, 0);
        if (hr == DIERR_INPUTLOST)                  // 入力ロストなら
            m_pDIDevice->Acquire();                 // 再度確保させる
        else if (FAILED(hr) || dwItem == 0) break;  // 読み込めない場合終了する
        else{
            switch (od.dwOfs){
            // マウスホイールの状態取得
            case DIMOFS_Z:
                {   // nMoveWheel にホイールの移動量が入る
                    int nMoveWheel = int(od.dwData);
                    break;
                }
            }
        }
    }


■ 終了処理(ExitInstance 推奨)

    #define SAFE_RELEASE(x) { if(x){ (x)->Release(); x=NULL;} }
    m_pDIDevice->Unacquire();
    SAFE_RELEASE(m_pDIDevice);
    SAFE_RELEASE(m_pDInput);




 Copyright 2005 VALGUS. All Rights Reserved.