Raw Input は入力デバイスを制御する低レベルAPI。 複数のマウスやキーボードを検出したりできるっぽい。
他にも、GamePad, WebCam, Scanner, などの各種デバイスを制御できるっぽい。 今回は2台のマウスを検出してみた。
入手先
参考
https://msdn.microsoft.com/en-us/library/windows/desktop/ms645536(v=vs.85).aspx
http://asawicki.info/news_1533_handling_multiple_mice_with_raw_input.html
RAWINPUTDEVICEにてデバイスを特定するときのUsagePageを調べる。
http://www.usb.org/developers/hidpage/#Usage_Tables
http://members.jcom.home.ne.jp/toya.hiroshi/ui/aboutrawinput.html
UsagePageを指定する
RAWINPUTDEVICE device;
device.usUsagePage = 0x01; // Generic Desktop Controls
device.usUsage = 0x02; // Mouse
device.dwFlags = 0;
device.hwndTarget = 0;
RegisterRawInputDevices(&device, 1, sizeof device);
これでマウスを検出できるようになる。 デバイスごとに異なる。詳しくは参考のURLを参照。
デバッグ出力
マウスの動作をデバッグ出力させた。 Visual C++ 2010 Express にて実行すると確認できる。 Windowには何も表示しない。
2つの異なるマウスを検出できた。
デバイス | Device Handle |
---|---|
ノートPC マウスパッド | 0x00010047 |
Logicool マウス(MX400) | 0x070B0489 |
- Device Handle:デバイスを判別できる
- ButtonFlags:マウスのボタン状態を判別できる
ノートPC マウスパッド
左クリック
Down
Mouse: Device=0x00010047, Flags=0000, ButtonFlags=1, ButtonData=0, ulRawButtons=0, X=0, Y=0, ulExtraInformation=0
Up
Mouse: Device=0x00010047, Flags=0000, ButtonFlags=2, ButtonData=0, ulRawButtons=0, X=0, Y=0, ulExtraInformation=0
右クリック
Down
Mouse: Device=0x00010047, Flags=0000, ButtonFlags=4, ButtonData=0, ulRawButtons=0, X=0, Y=0, ulExtraInformation=0
Up
Mouse: Device=0x00010047, Flags=0000, ButtonFlags=8, ButtonData=0, ulRawButtons=0, X=0, Y=0, ulExtraInformation=0
Logicool マウス
左クリック
Mouse: Device=0x070B0489, Flags=0000, ButtonFlags=1, ButtonData=0, ulRawButtons=0, X=0, Y=0, ulExtraInformation=0
Mouse: Device=0x070B0489, Flags=0000, ButtonFlags=2, ButtonData=0, ulRawButtons=0, X=0, Y=0, ulExtraInformation=0
右クリック
Mouse: Device=0x070B0489, Flags=0000, ButtonFlags=4, ButtonData=0, ulRawButtons=0, X=0, Y=0, ulExtraInformation=0
Mouse: Device=0x070B0489, Flags=0000, ButtonFlags=8, ButtonData=0, ulRawButtons=0, X=0, Y=0, ulExtraInformation=0
中クリック
Mouse: Device=0x070B0489, Flags=0000, ButtonFlags=16, ButtonData=0, ulRawButtons=0, X=0, Y=0, ulExtraInformation=0
Mouse: Device=0x070B0489, Flags=0000, ButtonFlags=32, ButtonData=0, ulRawButtons=0, X=0, Y=0, ulExtraInformation=0
ホイール前
Mouse: Device=0x070B0489, Flags=0000, ButtonFlags=1024, ButtonData=120, ulRawButtons=0, X=0, Y=0, ulExtraInformation=0
WM_MOUSEWHEEL
wheel delta=120
ホイール後
Mouse: Device=0x070B0489, Flags=0000, ButtonFlags=1024, ButtonData=-120, ulRawButtons=0, X=0, Y=0, ulExtraInformation=0
WM_MOUSEWHEEL
wheel delta=-120
チルト左(ButtonFlagsなど識別できる情報がない)
Mouse: Device=0x070B0489, Flags=0000, ButtonFlags=0, ButtonData=0, ulRawButtons=0, X=0, Y=0, ulExtraInformation=0
Mouse: Device=0x070B0489, Flags=0000, ButtonFlags=0, ButtonData=0, ulRawButtons=0, X=0, Y=0, ulExtraInformation=0
チルト右(ButtonFlagsなど識別できる情報がない)
Mouse: Device=0x070B0489, Flags=0000, ButtonFlags=0, ButtonData=0, ulRawButtons=0, X=0, Y=0, ulExtraInformation=0
Mouse: Device=0x070B0489, Flags=0000, ButtonFlags=0, ButtonData=0, ulRawButtons=0, X=0, Y=0, ulExtraInformation=0
Xボタン1
Mouse: Device=0x070B0489, Flags=0000, ButtonFlags=256, ButtonData=0, ulRawButtons=0, X=0, Y=0, ulExtraInformation=0
Mouse: Device=0x070B0489, Flags=0000, ButtonFlags=512, ButtonData=0, ulRawButtons=0, X=0, Y=0, ulExtraInformation=0
Xボタン2
Mouse: Device=0x070B0489, Flags=0000, ButtonFlags=64, ButtonData=0, ulRawButtons=0, X=0, Y=0, ulExtraInformation=0
Mouse: Device=0x070B0489, Flags=0000, ButtonFlags=128, ButtonData=0, ulRawButtons=0, X=0, Y=0, ulExtraInformation=0
問題
座標
デバッグ出力では、X, Y, は 0だと思う。 じつはマウスを移動させたとき、X=-1, Y=1, など相対座標として検出される。 相対値でなく絶対値で取得したいが、方法が分からない。
利用するためには、どうにかして自前でScreen座標とClient座標を生成する必要がある。 ポインティング・デバイスなのに肝心の座標がとれないとか…。
チルト・ホイール
tilt wheel(チルト・ホイール)は、マウスホイールを横に倒す機能。 マウスによってはチルト機能がついていない。
RawInputでtiltを検出しようとしても、ButtonFlagsなど見分けのつけられる情報は得られなかった。 ログだけは出力されるので、マウスから何らかの入力があったことだけは検出できるっぽい。 何の役にも立たないが。
Windows Vista以上なら、WM_MOUSEHWHEEL で処理できるらしい。 しかし、Windows XP以下なら、専用ドライバが必須。
ドライバの実装にもよるが、tiltするとWM_HSCROLLを投げることが多いらしい。 今回はXPで、ドライバも入れてないから、tiltを検出できなかった。 せっかくtiltがあるのに使えない…。
Logicool マウスのドライバ
Logicoolのマウスドライバは SetPoint という名前。 ダウンロード時点でファイルサイズが74MB以上もある。 インストールしたらいくつになることやら。 こんな重たいもの、わざわざtilt(チルトホイール)のためだけに入れたくない。
tiltのときにWM_HSCROLLを投げる処理を追加した最小限のドライバが欲しい…。