別のブログで公開してたものです。
一部をこっちのブログに移行しようと手動で(^^;)移行したものです。

前にWPFでマルチタッチを試してみたのと同様のWindowsストアアプリを試しに作ってみた。

Windowsストアアプリを新規作成して、canvasを張り付けてPointerPressed、PointerMoved、PointerReleasedイベントを取るようにする。
これらのイベントでマウス、ペン、タッチのイベントが発生する。
イベントで渡されるPointerRoutedEventArgsのGetCurrentPointで
PointerPointを取得してそのPointerDeviceのPointerDeviceTypeプロパティでマウス、ペン、タッチの区別ができる。
複数タッチを区別するのはPointerPointのPointerIdプロパティで行う。

サンプル:TestMultiTouchWS.zip

/// <summary>
/// ポインタープレスイベント
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
public void canvas_PointerPressed(object sender, PointerRoutedEventArgs e)
{
	PointerPoint point = e.GetCurrentPoint(canvas);
	// 座標取得
	Point p = point.Position;
	
	// 図形を生成
	Mark mark = null;
	switch (point.PointerDevice.PointerDeviceType)
	{
		case PointerDeviceType.Mouse:
			mark = Mark.makeMark(getButtonText(point.Properties), Mark.MOUSE_MARK_SIZE, Colors.Blue);
			break;
		case PointerDeviceType.Pen:
			// 筆圧から円のサイズを算出
			int size = (int)((Mark.STYLUS_MARK_SIZE_MAX - Mark.STYLUS_MARK_SIZE) * point.Properties.Pressure + Mark.STYLUS_MARK_SIZE);
			mark = Mark.makeMark(point.PointerId.ToString(), size, Colors.Green);
			break;
		case PointerDeviceType.Touch:
			mark = Mark.makeMark(point.PointerId.ToString(), Mark.TOUCH_MARK_SIZE, Colors.Red);
			break;
	}
	if (mark != null)
	{
		// 図形をキャンバスへ追加
		canvas.Children.Add(mark.label);
		canvas.Children.Add(mark.ellipse);
		canvas.UpdateLayout();
		
		// 座標を指定
		mark.SetPos(p);
		
		// ポインターをキャプチャ
		canvas.CapturePointer(e.Pointer);
		// IDごとに図形を保存
		pointerData[point.PointerId] = mark;
	}
}
	
/// <summary>
/// ポインタームーブイベント
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
public void canvas_PointerMoved(object sender, PointerRoutedEventArgs e)
{
	Mark mark;
	
	PointerPoint point = e.GetCurrentPoint(canvas);
	if (point.IsInContact)
	{
		// IDごとの図形を取得
		mark = pointerData[point.PointerId];
		if (point.PointerDevice.PointerDeviceType == PointerDeviceType.Mouse)
	{
		// ラベルにマウスのボタンの状態を設定
		mark.label.Text = getButtonText(point.Properties);
	}
	else if (point.PointerDevice.PointerDeviceType == PointerDeviceType.Pen)
	{
		// 筆圧から円のサイズを算出
		int size = (int)((Mark.STYLUS_MARK_SIZE_MAX - Mark.STYLUS_MARK_SIZE) * point.Properties.Pressure + Mark.STYLUS_MARK_SIZE);
		// 図形のサイズを指定
		pointerData[point.PointerId].ellipse.Width = size;
		pointerData[point.PointerId].ellipse.Height = size;
		canvas.UpdateLayout();
	}
	// 座標を指定
	mark.SetPos(point.Position);
	}
}

/// <summary>
/// ポインターリリースイベント
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
public void canvas_PointerReleased(object sender, PointerRoutedEventArgs e)
{
	PointerPoint point = e.GetCurrentPoint(canvas);
	
	// ポインターのキャプチャをリリース
	canvas.ReleasePointerCapture(e.Pointer);
	// 図形を削除
	canvas.Children.Remove(pointerData[point.PointerId].label);
	canvas.Children.Remove(pointerData[point.PointerId].ellipse);
	pointerData.Remove(point.PointerId);
}