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

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

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

非アクティブ時でもRawInputで入力を検出する

C++ Windows

ウィンドウアクティブ時に入力された装置を判断する方法は
RawInputによる入力に使用した装置の判断 - 堕(惰)プログラマ開発記録で紹介しました。


今回はウィンドウがアクティブでないときにもWM_INPUTに飛び
そこで処理を行うように変更しました。
以下のようにRAWINPUTDEVICEのdwFlagsを変更するとおkでした。

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_INPUTSINK; //ここを変更。それだけ。
      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;
}

たった一行で動作が結構変わるみたいで。
ググったらすぐに出てきたけど、まあ、おもしろかった。