C#言語

【C#】RawInputでUSB-HIDのイベントをモニターする方法

はじめに

USB-HID(Human Interface Device)は、キーボードやマウス、ゲームパッドなどの入力の標準規格です。
これらのデバイスが送信するイベントをモニターすることで、特定の入力を検出したり、
独自のアクションを実行したりできます。

SANACHAN
SANACHAN
USBのプロトコルについては、以下の書籍がお勧めです。

本記事では、C# で RawInput API を使用した USB-HIDデバイスのモニター方法を解説します。
ゲーム実況やデバイスの動作確認、カスタム入力の実装に役立つと思います。

 

RawInput API とは?

RawInput は、キーボードやマウス、ジョイスティック、タッチスクリーンなど、
さまざまな入力デバイスからの生データを直接アプリケーションで受け取るための API です。

USB プロトコルでは、デバイス側(入力デバイスなど)は、
ホスト側(PCなど)からの IN パケットに応答する形でしか OUT データを送信できないため、
1ms 間隔で常にデータのやり取りが行われます。

RawInput API は、このような高速なデータ通信に対応できるように設計された低レイヤーの API です。

SANACHAN
SANACHAN
高速な処理が必要となるため、GUI のメッセージループに紐づけて使用します。

 

RawInput API の使い方

入力監視するデバイスの登録

まず、入力を監視したいデバイスを登録します。
今回はゲームコントローラとして、ジョイスティックを登録します。

  • usUsagePage
    デスクトップを制御することができる入力デバイスを指定(0x01)
  • usUsage
    0x01:キーボード、0x02:マウス、0x04:ジョイスティック
  • dwFlags
    ウィンドウがアクティブでない時でも入力を受信できる RIDEV_INPUTSINK を指定
  • hwndTarget
    紐づけるウィンドウのハンドルを指定

 

GUIのメッセージループと紐づけ

Form などのウィンドウを持つクラス内で this.Handle でウィンドウハンドルを取得できます。
先ほどの関数にハンドルを渡すことで GUI のメッセージループに紐づけることができます。

 

入力デバイスを登録すると、WM_INPUT のメッセージを受け取れるようになります。
WndProc をオーバーライドしてメッセージを解析します。

SANACHAN
SANACHAN
ウィンドウ本来の処理を実行するため、基底クラスの WndProc も呼び出します。

 

入力データの取得

さまざまな入力デバイスに対応するため、HID から入力されるデータは可変長になっています。
そのため、まずヘッダーを読み出してデータサイズを取得した後、ペイロードを読み出します。

 

RawInput API を使ったサンプルコード

デバイスの登録、データの読出し、コールバック処理を RawInputMonitor クラスとして纏めています。

 

ウィンドウを持つ Form1 クラスです。

 

おわりに

最近のデスクトップ PC はすごい。1ms 間隔の処理を難なくこなす。

この API を使用したアプリケーション「BeatCounter」を以下に置いています。

https://github.com/SANACHAN-prog/BeatCounter

DAOコントローラーのみに対応
※KONAMI さんの Beatmania IIDX INFINITAS 用、2P側のみ対応

 

こちらの記事もよく読まれています

  • この記事を書いた人
  • 最新記事
SANACHAN

SANACHAN

「生涯一エンジニア」を掲げ、大手グローバル企業でSE/PGとして8年勤め、キャリアアップ転職した現役のエンジニアです。世にあるメジャーな全プログラム言語(コボル除く)を自由に扱えます。一児の父。自分のため、家族のため、日々勉強してます。システムエンジニア、プログラミングに関する情報を蓄積している雑記帳です。

-C#言語
-, , , , ,