読者です 読者をやめる 読者になる 読者になる

堕(惰)プログラマ開発記録

タイトル変えようかなとも思ってるけれど,思い浮かばない

RawInputによる入力に使用した装置の判断

C++ Windows

キーボード入力を読み取り、入力元のキーボードのHIDを取得と動作の分岐をしたかったので
Win32 APIにあるかなー」と探してみたところ、
RawInputというAPIが見つかったので使ってみました。


結構MSDNから引っ張ってきたけど、ウィンドウプロシージャを以下のようにするととれるらしい。

LRESULT CALLBACK WinProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
{
  switch(Msg)
  {
  case WM_CREATE:
    {
      RAWINPUTDEVICE Rid[1];
      Rid[0].usUsagePage = 0x01; 
      Rid[0].usUsage = 0x06;     //0x02にするとマウス。
      Rid[0].dwFlags = RIDEV_NOLEGACY;
      Rid[0].hwndTarget = hWnd;
      RegisterRawInputDevices(Rid, 1, sizeof(Rid[0]));
      break;
    }
  case WM_INPUT:
    {
      UINT dwSize = 40;
      BYTE lpb[40];
      
      GetRawInputData((HRAWINPUT)lParam, RID_INPUT, lpb, &dwSize, sizeof(RAWINPUTHEADER));
      RAWINPUT* raw = (RAWINPUT*)lpb;

      //ここにHIDをここに収納できる。
      HANDLE Device_HID = raw->header.hDevice;

      break;      
    }

  case WM_DESTROY:
    PostQuitMessage(0);
    break;
  default:
    return DefWindowProc(hWnd, Msg, wParam, lParam);
  }
  return 0L;
}


エラー判定をかませたほうがいいかも。
GetRawInputDataとRegisterRawInputDevicesに付けるのがいいのかな。
あと、dwSizeをGetRawInputDataから貰ったら、それでlpbのサイズを作った方がいいのかな。


まあ、何をやっているのかというと、
WM_CREATEで従来のMsg通知を切って、WM_INPUT(WindowsXP以降)を使用するように指定。
それを処理しているわけ。(多分)


コメントのように"Rid[0].usUsage = 0x02;"にするとマウスでも同じことができるようなので試してみるといいかも。
あとRidは配列だから、数を増やしてやると複数指定ができるのかな?


RAWINPUTDEVICELISTとうまく組み合わせるととても幸せになれるんじゃないかな。
やってみようと思ってるよ。