このページは、戸谷 が次のページ
Using Raw Input
を日本語に訳した個人のページです。
内容などはマイクロソフトに著作権があり、固有の名称は商標や登録商標です。
このページの記述に基づいて元の著者に問い合わせることは、
元の著者の迷惑になりますので避けてください。 > トップページ
   MSDN ホーム(英語) >  MSDN ライブラリ(英語) >  操作まわりの設計と開発(英語) >  ウィンドウズの操作まわり(英語) >  利用者からの入力(英語) >  直接入力(英語) >

直接入力の使用


この節のコード例の目的は……

直接入力の登録

例 #1: この例ではゲーム コントローラ (ゲーム パッドとジョイスティックの両方) からの直接入力を設定します。
また、留守番電話を除いた電話機からも直接入力を設定します。

RAWINPUTDEVICE Rid[4];

Rid[0].usUsagePage = 01h; 
Rid[0].usUsage = 05h; 
Rid[0].dwFlags = 0;                 // ゲーム パッドを追加します。

Rid[1].usUsagePage = 01h; 
Rid[1].usUsage = 04h; 
Rid[1].dwFlags = 0;                 // ジョイスティックを追加します。

Rid[2].usUsagePage = 0Bh; 
Rid[2].usUsage = 00h; 
Rid[2].dwFlags = RIDEV_PAGEONLY;    //電話機を追加します。

Rid[3].usUsagePage = 0Bh; 
Rid[3].usUsage = 02h; 
Rid[3].dwFlags = RIDEV_EXCLUDE;     //留守番電話を除外します。

if (RegisterRawInputDevices(Rid, 4, sizeof(Rid[0])) == FALSE) {
    //登録できませんでした。原因を調べるために GetLastError 関数を呼んでください。
}

例 #2: この例では、キーボードとマウスからの直接入力を要求しますが、同じ通知が来る従来のウィンドウ通知は無視します。

RAWINPUTDEVICE Rid[2];

Rid[0].usUsagePage = 01h; 
Rid[0].usUsage = 02h; 
Rid[0].dwFlags = RIDEV_NOLEGACY;   // HID マウス通知を追加して、従来のマウス通知を無視します。

Rid[1].usUsagePage = 01h; 
Rid[1].usUsage = 06h; 
Rid[1].dwFlags = RIDEV_NOLEGACY;   // HID キーボードを追加して、従来のキーボード通知を無視します。

if (RegisterRawInputDevices(Rid, 2, sizeof (RID [0])) == FALSE) {
    //登録できませんでした。原因を調べるために GetLastError 関数を呼んでください。
}

直接入力の標準の読みとり

この例では、キーボードかマウスから直接入力を非蓄積(標準)型で読みとる方法を示します。
そして、その機器からのいろいろな情報を表示します。

case WM_INPUT: 
{
    UINT dwSize;

    GetRawInputData((HRAWINPUT)lParam, RID_INPUT, NULL, &dwSize, 
                    sizeof(RAWINPUTHEADER));
    LPBYTE lpb = new BYTE[dwSize];
    if (lpb == NULL) 
    {
        return 0;
    } 

    if (GetRawInputData((HRAWINPUT)lParam, RID_INPUT, lpb, &dwSize, 
         sizeof(RAWINPUTHEADER)) != dwSize )
         OutputDebugString (TEXT("GetRawInputData doesn't return correct size !\n")); 

    RAWINPUT* raw = (RAWINPUT*)lpb;

    if (raw->header.dwType == RIM_TYPEKEYBOARD) 
    {
        hResult = StringCchPrintf(szTempOutput, STRSAFE_MAX_CCH, TEXT(" Kbd: make=%04x Flags:%04x Reserved:%04x ExtraInformation:%08x, msg=%04x VK=%04x \n"), 
        raw->data.keyboard.MakeCode, 
        raw->data.keyboard.Flags, 
        raw->data.keyboard.Reserved, 
        raw->Data.keyboard.ExtraInformation, 
        raw->data.keyboard.Message, 
        raw->data.keyboard.VKey);
        if (FAILED(hResult))
        {
        // 処理: エラー処理を記述してください。
        }
        OutputDebugString(szTempOutput);
    }
    else if (raw->header.dwType == RIM_TYPEMOUSE) 
    {
        hResult = StringCchPrintf(szTempOutput, STRSAFE_MAX_CCH, TEXT("Mouse: usFlags=%04x ulButtons=%04x usButtonFlags=%04x usButtonData=%04x ulRawButtons=%04x lLastX=%04x lLastY=%04x ulExtraInformation=%04x\r\n"), 
        raw->data.mouse.usFlags, 
        raw->data.mouse.ulButtons, 
        raw->data.mouse.usButtonFlags, 
        raw->data.mouse.usButtonData, 
        raw->data.mouse.ulRawButtons, 
        raw->data.mouse.lLastX, 
        raw->data.mouse.lLastY, 
        raw->data.mouse.ulExtraInformation);

        if (FAILED(hResult))
        {
        // 処理: エラー処理を記述してください。
        }
        OutputDebugString(szOutput);
    } 

    delete[] lpb; 
    return 0;
} 

直接入力の蓄積型の読みとり

この例では、一般の HID からの蓄積型の読みとりの方法を示します。

case MSG_GETRIUFFER: // 私的な通知
{
    UINT cbSize; 
    Sleep(1000); 

    VERIFY(GetRawInputBuffer(NULL, &cbSize, /*0, 
            */sizeof(RAWINPUTHEADER)) == 0);
    cbSize *= 16;            // だいたいです。
    Log(_T("Allocating %d bytes"), cbSize); 
    PRAWINPUT pRawInput = (PRAWINPUT)malloc(cbSize); 
    if (pRawInput == NULL) 
    {
        Log(_T("Not enough memory"));
        return; 
    } 
    for (;;) 
    {
        UINT cbSizeT = cbSize;
        UINT nInput = GetRawInputBuffer(pRawInput, &cbSizeT, /*0, 
                      */sizeof(RAWINPUTHEADER));
        Log(_T("nInput = %d"), nInput);
        if (nInput == 0) 
        {
            break;
        }
        ASSERT(nInput > 0);
        PRAWINPUT* paRawInput = (PRAWINPUT*)malloc(sizeof(PRAWINPUT) * 
                                 nInput);
        if (paRawInput == NULL) 
        {
            Log(_T("paRawInput NULL"));
            break; 
        } 
        PRAWINPUT pri = pRawInput;
        for (UINT i = 0; i < nInput; ++i) 
        { 
            Log(_T(" input[%d] = @%p"), i, pri);
            paRawInput[i] = pri;
            pri = NEXTRAWINPUTBLOCK(pri);
        }
        // メモリを初期化します。
        DefRawInputProc(paRawInput, nInput, sizeof(RAWINPUTHEADER)); 
        
        free(paRawInput);
    }
    free(pRawInput);
}