小ネタ:Surface Pro のペンの消しゴム機能をアプリで認識するには
#win8dev_jp
Surface Pro にはペンが付いています。
ペンの入力は、Pointer イベントで取得できるので、とくに特別な実装は必要ありません。
あ、ちなみに注意が必要なのはマウスと同じようにペンを浮かせてもホバー状態になるので、PointerMove などは発生しますし、ホバー状態でも、PointerEnter / PointerExited などのイベントは普通に発生します。
さて本題に戻りましょう。
Surface Pro のペンの頭はボタンが付いておりこちらを使うと一部のアプリでは消しゴムとして使うことができます。ちなみに、普通に実装するとペン先と同じようにPointerMove などのイベントが発生するので普通に使えるのですが、これをペン先と区別して認識するにはどうしたらいいか?
消しゴム機能の判定
pointerProperties の IsEraser でチェックすることができます。
pointerProperties はPointer 系のイベントの引数から GetCurrentPoint で PointerPoint オブジェクト(Pointerオブジェクトではないところがミソ)を取得してその中のProperties プロパティから取得することができます。
void MainPage_PointerPressed(object sender, PointerRoutedEventArgs e)
{
var pointerProperties = e.GetCurrentPoint(null).Properties;
var keypressed = e.KeyModifiers;
if( pointerProperties.IsEraser )
//消しゴムとしての処理
else
//ペンとしての処理
}
いろいろな入力状態が取れる pointerProperties
この pointerProperties には様々な入力デバイスの状態が保存されています。
ペン
- IsBarrelButtonPressed:ペンの脇についているボタンが押されているかどうか
- IsEraser:ペンの消しゴム機能が使われているかどうか
- IsInvert:デジタイザーが反転の状態で使われているかどうか
- Pressure:筆圧
- Twist:ペンのひねり方向
- XTilt、YTilt:ペンの縦/横方向への傾き
マウス
- IsHorizontalMouseWheel :ホイールの水平チルトが使われているかどうか
- IsLeftButtonPressed:左ボタンが押されているか
- IsMiddleButtonPressed:中ボタンが押されているか
- IsRightButtonPressed:右ボタンが押されているか
- IsXButton1Pressed:拡張ボタン1が押されているか
- IsXButton2Pressed:拡張ボタン2が押されているか
- MouseWheelDelta:マウスホイールのまわされた量の差分
これで、ペンのボタンなども判定できますね。
例:ペンボタンを押された時には…
入力デバイスが何かは簡単にわかる
入力デバイスの判定は、Pointer オブジェクトの PointerDeviceType で確認できます。
void MainPage_PointerPressed(object sender, PointerRoutedEventArgs e)
{
if (e.Pointer.PointerDeviceType == Windows.Devices.Input.PointerDeviceType.Mouse )
// マウスの場合の処理
ここで認識されているは、3つですね。
- Windows.Devices.Input.PointerDeviceType.Pen:ペン
- Windows.Devices.Input.PointerDeviceType.Mouse:マウス
- Windows.Devices.Input.PointerDeviceType.Touch:タッチ
これに、前述の PointerPointProperties の情報を加えてやれば、細かい設定が可能です。
例:マウスなら右クリック、ペンならペンボタンを押された時には…
ちなみに、外付けのタッチパッドはノートのタッチパッド同様、通常はマウスとして認識されますね。(例:WACOM BAMBOO PAD、Logicool T650)なんとなく気持ち的にはペンとして認識してほしいですけどね。そのへんは上位モデルを使ってくださいw
特殊キーの入力判定
ちなみに、キーボード付きの環境で、特殊キーが押されていたかを判定するのは簡単です。
Pointerイベントの KeyModidiers をチェックすれば、Shift / Ctrl / Win / Menu キーが押されていたかの状態判定は可能です。
void MainPage_PointerPressed(object sender, PointerRoutedEventArgs e)
{
var keypressed = e.KeyModifiers;
if( e.KeyModifiers == Windows.System.VirtualKeyModifiers.Shift )
//Shiftキーが押されていた時の処理
else
//通常の処理
}
キーボード&マウスの環境では、キーボードも併用してやる方法もありますね。
例:マウスなら右クリックドラッグ、もしくは Shift キーを押しながらドラッグ、ペンならペンボタンを押しながらドラッグ された時には…
まずはスタンダードに、アプリができたら対応しよう!
ペンタブレットがいろいろ出てきました。ぜひ、ペンが付いている機種では更に使いやすくなるように、こういった機能を使って付加価値をつけてみてください ♪
Comments
- Anonymous
February 25, 2014
IsEraserを試してみたところ、PointerPressedでは正しく判定されるのですが、 PointerReleased のイベントでは常にfalseでした。