WPFのポインティングデバイスイベントのクセ


.NETでは標準でイマドキの入力装置のイベントを検知してくれるのだが、
少々クセがある。
将来迷わないようここにそのルールを記しておきたい。

クセとは

ポインティングデバイスは3種類、マウス・ペン・タッチ(指)があるのだが、他のイベントも発行してしまうのだ。
例えばタッチ(指)ではTouchDownの他に、StylusDownも発行する(ナンデヤネン)
しかもStylusの方が先に来るからややこしい。

問題点

当然、今使っているのがマウスなのかペンなのか、分からなければ困る。
同じドラッグでもペンならレフトボタンの状態は関係ないとか、タッチなら指二本を制御するとか。

解決方法

とにかくまずはイベントを拾ってみる。
動作イベントはどうでもいい。入力の瞬間さえ判別できればあとはフラグでどうとでもなる。


        private void PreviewStylusDown(object sender, StylusDownEventArgs e)
        {
            Debug.Print("StylusDown");
        }

        private void PreviewTouchDown(object sender, TouchEventArgs e)
        {
            Debug.Print("TouchDown");
        }

        private void MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            Debug.Print("MouseLeftButton");
        }

        private void PreviewTouchUp(object sender, TouchEventArgs e)
        {
            Debug.Print("TouchUp");
        }

        private void PreviewStylusUp(object sender, StylusEventArgs e)
        {
            Debug.Print("SyulsUp");
        }

        private void PreviewMouseLeftButtonUp(object sender, MouseButtonEventArgs e)
        {
            Debug.Print("MouseLeftUp");
        }

こんな具合。

マウス

MouseLeftButton
MouseLeftUp

マウスのみのようだ

ペン

StylusDown
MouseLeftDown
StylusUp
MouseLeftUp

ペンとマウスが反応する。
・・・と思いきやぐっと押すと・・・

StylusDown
StylusUp

ペンだけ反応する。

タッチ

StylusDown
TouchDown
MouseLeftButton
SyulsUp
TouchUp
MouseLeftUp

全部反応する。
・・・と思いきや、グッと押さえて離すと結果が違う。

StylusDown
TouchDown
SyulsUp
TouchUp

何故かマウスイベントが発生しない(メーカーによるのだろうか?)

発生イベントの整理

まとめるとこうなる。

イベント/入力 マウス ペン タッチ
StylusDown
TouchDown
MouseLeftButton

さて困ったぞ。
タッチとマウスは簡単だが、ペンをエレガントに判定する方法が無い。
強引に毎イベント判定が一番シンプルか・・・?