この節のコード例の目的は……
直接入力の登録
例 #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);
}