- 題名: Windows タッチ メッセージの処理
- 日時: 2014/07/18 10:11:47
- ID: 32478
- この記事の返信元:
- (なし)
- この記事への返信:
- [32479] Re[1]: Windows タッチ メッセージの処理2014/07/18 10:34:56
- ツリーを表示
該当スレッドの質問者です。 TOUCHINPUT構造体ですが、以下のように宣言しております。 <StructLayout(LayoutKind.Sequential)> _ Public Structure TOUCHINPUT Dim x As Int32 Dim y As Int32 Dim hSource As IntPtr Dim dwID As UInt32 Dim dwFlags As UInt32 Dim dwMask As UInt32 Dim dwTime As UInt32 Dim dwExtraInfo As IntPtr Dim cxContact As UInt32 Dim cyContact As UInt32 End Structure >If GetTouchInputInfo(lParam, cInputs, b, 48) Then のIF文でTrueにならないとのことですが、現状のソースを確認したところ If GetTouchInputInfo(lParam, cInputs, b, Marshal.SizeOf(GetType(TOUCHINPUT))) Then と変更しております。 現在、タッチパネルの環境がない為、確認出来ておりませんが、32bit,64bitの環境で サイズが異なっているのではないでしょうか? 該当スレッドのDecodeTouch関数ですが、この中で行っていることは以下の通りです。 1.wParamよりタッチされている点数を取得 2.タッチ情報を格納する領域の確保 3.タッチ情報の取得 4.タッチされている点数分処理を行う 5.取得したタッチ情報の解放 私の経験上の注意点なのですが、Windows8とWindows7では微妙にイベントの発生が 異なりましたので、環境がWindows8とのことですが、Windows7でも動作させる場合は お気を付けください。
■No32483に返信(ムーミンさんの記事) > 下記のページが丸ごと使えそうで試してみたのですが、 > http://dobon.net/cgi-bin/vbbbs/cbbs.cgi?mode=al2&namber=32095&no=0 > 当方の環境ではGetTouchInputInfoのif文でfor文の処理に入りません。 ということは、cInputs の値が 0 以下だったりはしませんか? 当方環境では、AnyCPU ビルド/X64 ビルドのいずれにおいても、 以下のコードでタッチ操作を追跡できています。 Imports System.Windows.Forms Imports System.Runtime.InteropServices Public Class Form1 Inherits System.Windows.Forms.Form Private Declare Function RegisterTouchWindow Lib "user32" _ (ByVal hWnd As IntPtr, ByVal ulFlags As UInt32) As Boolean Private Declare Function UnregisterTouchWindow Lib "user32" _ (ByVal hWnd As IntPtr) As Boolean Private Declare Function GetTouchInputInfo Lib "user32" _ (ByVal hTouchInput As IntPtr, ByVal cInputs As UInt32, _ ByVal pInputs As IntPtr, ByVal cbSize As Integer) As Boolean Private Declare Function CloseTouchInputHandle Lib "user32" _ (ByVal hTouchInput As IntPtr) As Boolean Private Const WM_TOUCH As Integer = &H240 <Flags> _ Private Enum TouchEventF As UInt32 Move = &H1UI Down = &H2UI Up = &H4UI InRange = &H8UI Primary = &H10UI NoCoalesce = &H20UI Pen = &H40UI Palm = &H80UI End Enum <Flags> _ Private Enum TouchInputMaskF As UInt32 TimeFromSystem = &H1UI ExtraInfo = &H2UI ContactArea = &H4UI End Enum <StructLayout(LayoutKind.Sequential)> _ Private Structure TOUCHINPUT Dim x As Int32 Dim y As Int32 Dim hSource As IntPtr Dim dwID As UInt32 Dim dwFlags As TouchEventF Dim dwMask As TouchInputMaskF Dim dwTime As UInt32 Dim dwExtraInfo As IntPtr Dim cxContact As UInt32 Dim cyContact As UInt32 End Structure Private Const TOUCHEVENTF_DOWN As UInteger = &H2 Private Const TOUCHEVENTF_UP As UInteger = &H4 Private Const TOUCHEVENTF_INRANGE As UInteger = &H8 Protected Overrides Sub OnHandleCreated(ByVal e As EventArgs) MyBase.OnHandleCreated(e) RegisterTouchWindow(Me.Handle, 0) End Sub Protected Overrides Sub OnHandleDestroyed(ByVal e As EventArgs) MyBase.OnHandleDestroyed(e) UnregisterTouchWindow(Me.Handle) End Sub Protected Overrides Sub WndProc(ByRef m As Message) If m.Msg = WM_TOUCH Then DecodeTouch(m.LParam, m.WParam) Else MyBase.WndProc(m) End If End Sub Private Sub DecodeTouch(ByVal lParam As IntPtr, ByVal wParam As IntPtr) Dim cInputs As UInt32 = CUInt(wParam.ToInt64() And &HFFFFL) Trace.WriteLine("cInputs=" & CStr(cInputs)) If cInputs = 0 Then Return End If Dim iCount As Integer = CInt(cInputs) Dim inputs() As TOUCHINPUT = New TOUCHINPUT(iCount) {} Dim gch As GCHandle = GCHandle.Alloc(inputs, GCHandleType.Pinned) Dim b As IntPtr = gch.AddrOfPinnedObject() Dim sz As Integer = Marshal.SizeOf(GetType(TOUCHINPUT)) If GetTouchInputInfo(lParam, cInputs, b, sz) Then For i As Integer = 0 To iCount - 1 Trace.WriteLine(String.Format(" => TOUCHINPUT[{0}].dwFlags={1}", i, inputs(i).dwFlags)) Next Else Trace.WriteLine(System.Runtime.InteropServices.Marshal.GetLastWin32Error()) End If CloseTouchInputHandle(lParam) gch.Free() End Sub End Class 以下は、当方での実行結果の抜粋です。 cInputs=1 => TOUCHINPUT[0].dwFlags=Down, InRange, Primary cInputs=2 => TOUCHINPUT[0].dwFlags=Move, InRange, Primary => TOUCHINPUT[1].dwFlags=Down, InRange cInputs=3 => TOUCHINPUT[0].dwFlags=Move, InRange, Primary => TOUCHINPUT[1].dwFlags=Move, InRange => TOUCHINPUT[2].dwFlags=Down, InRange cInputs=4 => TOUCHINPUT[0].dwFlags=Move, InRange, Primary => TOUCHINPUT[1].dwFlags=Move, InRange => TOUCHINPUT[2].dwFlags=Move, InRange => TOUCHINPUT[3].dwFlags=Down, InRange (中略) cInputs=10 => TOUCHINPUT[0].dwFlags=Move, InRange, Primary => TOUCHINPUT[1].dwFlags=Move, InRange => TOUCHINPUT[2].dwFlags=Move, InRange => TOUCHINPUT[3].dwFlags=Move, InRange => TOUCHINPUT[4].dwFlags=Move, InRange => TOUCHINPUT[5].dwFlags=Move, InRange => TOUCHINPUT[6].dwFlags=Move, InRange => TOUCHINPUT[7].dwFlags=Move, InRange => TOUCHINPUT[8].dwFlags=Move, InRange => TOUCHINPUT[9].dwFlags=Down, InRange cInputs=10 => TOUCHINPUT[0].dwFlags=Move, InRange, Primary => TOUCHINPUT[1].dwFlags=Move, InRange => TOUCHINPUT[2].dwFlags=Move, InRange => TOUCHINPUT[3].dwFlags=Move, InRange => TOUCHINPUT[4].dwFlags=Move, InRange => TOUCHINPUT[5].dwFlags=Move, InRange => TOUCHINPUT[6].dwFlags=Move, InRange => TOUCHINPUT[7].dwFlags=Move, InRange => TOUCHINPUT[8].dwFlags=Move, InRange => TOUCHINPUT[9].dwFlags=Move, InRange cInputs=10 => TOUCHINPUT[0].dwFlags=Move, InRange, Primary => TOUCHINPUT[1].dwFlags=Move, InRange => TOUCHINPUT[2].dwFlags=Move, InRange => TOUCHINPUT[3].dwFlags=Move, InRange => TOUCHINPUT[4].dwFlags=Move, InRange => TOUCHINPUT[5].dwFlags=Move, InRange => TOUCHINPUT[6].dwFlags=Up, InRange => TOUCHINPUT[7].dwFlags=Move, InRange => TOUCHINPUT[8].dwFlags=Move, InRange => TOUCHINPUT[9].dwFlags=Move, InRange (中略) cInputs=4 => TOUCHINPUT[0].dwFlags=Move, InRange, Primary => TOUCHINPUT[1].dwFlags=Up => TOUCHINPUT[2].dwFlags=Move, InRange => TOUCHINPUT[3].dwFlags=Move, InRange cInputs=3 => TOUCHINPUT[0].dwFlags=Move, InRange, Primary => TOUCHINPUT[1].dwFlags=Move, InRange => TOUCHINPUT[2].dwFlags=Move, InRange cInputs=3 => TOUCHINPUT[0].dwFlags=Move, InRange, Primary => TOUCHINPUT[1].dwFlags=Move, InRange => TOUCHINPUT[2].dwFlags=Up cInputs=2 => TOUCHINPUT[0].dwFlags=Move, InRange, Primary => TOUCHINPUT[1].dwFlags=Move, InRange cInputs=2 => TOUCHINPUT[0].dwFlags=Up, Primary => TOUCHINPUT[1].dwFlags=Move, InRange cInputs=1 => TOUCHINPUT[0].dwFlags=Move, InRange cInputs=1 => TOUCHINPUT[0].dwFlags=Up '========================== なお上記の結果は、10本タッチした後は、7番目の指から離しているため、 TOUCHINPUT[6].dwFlags に Up フラグが立っています。 (当方のデバイスでは、最大10指までしか検出できません)
分類:[.NET]