やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

RawInputを使ってみた

Raw Input は入力デバイスを制御する低レベルAPI。 複数のマウスやキーボードを検出したりできるっぽい。

他にも、GamePad, WebCam, Scanner, などの各種デバイスを制御できるっぽい。 今回は2台のマウスを検出してみた。

HelloRawInput

入手先

GitHub MEGA

参考

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を投げる処理を追加した最小限のドライバが欲しい…。