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

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

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

RawInputで接続されている入力装置を取得する

C++ Windows

昨日の続き。
入力装置の取得も簡単だった。
クラスみたいなの作ってみたけど、カプセル化しようとして、
かえってわかりにくくなったんじゃないかと思う。
うーむ。

class raw_inputs
{
  UINT input_devices_;
  RAWINPUTDEVICELIST *rawinput_device_list_;
public:
  raw_inputs()
  {
    if(reset()) return;
  }
  ~raw_inputs()
  {
    if(rawinput_device_list_ != NULL) delete[] rawinput_device_list_;
  }
  int reset()
  {
    //接続されているデバイス数 >> input_devices_
    if(GetRawInputDeviceList(NULL,&input_devices_,sizeof(RAWINPUTDEVICELIST))!=0) return 1;
    
    rawinput_device_list_ = new RAWINPUTDEVICELIST[input_devices_];

    size_t size = (rawinput_device_list_) ? input_devices_ : 0;
    if(rawinput_device_list_ == NULL) return 2;
    
    UINT ntmp = input_devices_;
    if (GetRawInputDeviceList(rawinput_device_list_, &input_devices_, sizeof(RAWINPUTDEVICELIST)) != ntmp)  return 3;

    return 0;
  }

  UINT operator() (RAWINPUTDEVICELIST *raw) const
  {
    if(raw == NULL) return input_devices_;
    for(UINT i = 0; i < input_devices_; ++i)
      *(raw+i) = rawinput_device_list_[i];
    return input_devices_;
  }

  static const enum device_type{ Mouse_Type , KeyBoard_Type , HID_Type};

  UINT keyboard(device_type type,RAWINPUTDEVICELIST *raw,UINT *size)
  {
    UINT counter = 0;
    if(raw == NULL)
    {
      for(UINT i = 0; i < input_devices_; ++i)
      {
        if(rawinput_device_list_[i]. dwType == type) ++counter;
      }
    }
    else
    {
      for(UINT i = 0; i < input_devices_; ++i)
      {
        if(rawinput_device_list_[i]. dwType == type)
        {
          *(raw+counter) = rawinput_device_list_[i];
          ++counter;
        }
      }
    }
    return *size = counter;
  }
};


で、このクラス、作ると勝手にresetを呼ぶので取得してくれるというわけですね。
自動でデバイスの状態を検知してresetしてくれるようにはできませんでした。


使うときは条件によって以下の二つの使い方ができます。

//全取得
void hoge1(){
  raw_inputs raw;
  UINT device_num;
  device_num = raw(NULL);

  RAWINPUTDEVICELIST *device_list = new RAWINPUTDEVICELIST[device_num];
  device_num = raw(device_list);

  delete[] device_list;
  return;
}

//キーボードのみの取得
void hoge2(){
  raw_inputs raw;
  UINT device_num;

  raw(raw_inputs::KeyBoard_Type,NULL,&i);

  RAWINPUTDEVICELIST *device_list = new RAWINPUTDEVICELIST[i];
  A.keyboard(raw_inputs::KeyBoard_Type,r,&i);

  delete[] device_list;
  return;
}


ああ、よく見るとおかしいわー