Win32で、マウス入力を得る方法エトセトラ。(知っているor分かった範囲)
通常はもちろんウィンドウメッセージのWM_MOUSEMOVEやWM_?BUTTON?をウィンドウプロシージャでハンドリングしてやれば済む話なのだが、訳あって他の方法も検証してみる必要があったのでメモ。
-
WM_INPUTでRAWINPUTを取得(Win2003Server以降)
WH_MOUSEフック
WH_MOUSE_LLフック(Win2K以降)
WH_JOURNALRECORDフック
WH_CBTフック(未検証)
何故そんな回りくどいやり方を試してみなければならないのかについては、(仕事なので)詳しく書くことはできない。問題のない範囲で簡単に説明すると、マウスドライバのデータ出力および、それに伴ってOSの入力キューがどのような挙動をしているか検証したかった為。
ちなみにUSBマウスの場合でも、HIDから直接データを得ることはできない。おそらくOSのRIT(=Raw Input Thread)がデバイスを排他的にオープンしているため、CreateFileに失敗する。
それぞれの方法について若干詳しくメモしておく
1.WM_INPUT
WM_INPUTはXP以降で利用できるようになったメッセージである。これを利用すればMouse,Keyboard,HIDなどの入力デバイスから、生データを取得できる(はず)。
あるデバイスの入力データをこのメッセージで受け取ることができるようにするには、GetRawInputDeviceList API や GetRawInputDeviceInfo API を利用してデバイスを特定し、RegisterRawInputDevices API で登録する必要がある。
あとは WM_INPUT をハンドリングするか、あるいはポーリングし、RAWINPUT構造体としてデータを受け取って処理を行う。
2.WH_MOUSEフック
3.WH_MOUSE_LLフック
通常のマウスフック。今回は特定ウィンドウ向けではなく全マウス入力が検証の対象であるため DLLにフックプロシージャを置き、グローバルフックにする。
4.WH_JOURNALRECORDフック
Windows操作記録用のフック。このフックを用いれば、OSは暗黙にスレッドごとの仮想入力キューをいくつか統合する(はず)。
5.WH_CBTフック
このフックはMSDNを見ると、「トレーニングアプリケーション用のフック」とある。なんとなく入力も取れそうな気がするのだが、ちょっと試してみたところうまくいかなかった。MSDNの内容も分かりにくいし、関連資料が少ないため断念。時間があるときにでも調べてみることにする。
でも結局、立てた仮説を立証するようなデータは得られなかった。違うアプローチでやらないとだめかも。:-(