Win32 API 日本語リファレンス
ホームUI.Input.Touch › TOUCHINPUT

TOUCHINPUT

構造体
サイズx64: 48 バイト / x86: 40 バイト

サイズ=各フィールドのバイト数(x64/x86 で異なる場合は x64/x86 と併記)。x64/x86 列=フィールドのバイトオフセット(HSPで dupptr / lpoke / wpoke 等に使用)。

フィールド

フィールドサイズx64x86説明
xINT4+0+0タッチ入力の x 座標 (水平方向の位置) です。このメンバーは、物理画面座標におけるピクセルの 100 分の 1 単位で示されます。
yINT4+4+4タッチ入力の y 座標 (垂直方向の位置) です。このメンバーは、物理画面座標におけるピクセルの 100 分の 1 単位で示されます。
hSourceHANDLE8/4+8+8入力元デバイスのデバイスハンドルです。各デバイスには、実行時にタッチ入力プロバイダーによって一意のプロバイダーが割り当てられます。以下の のセクションを参照してください。
dwIDDWORD4+16+12特定のタッチ入力を識別するタッチポイント識別子です。この値は、接触が開始してから離れるまでのタッチ接触シーケンスの間、一貫して保たれます。ID は、後続の接触で再利用されることがあります。
dwFlagsTOUCHEVENTF_FLAGS4+20+16タッチポイントの押下、解放、移動に関するさまざまな側面を指定するビットフラグのセットです。このメンバーのビットには、解説セクションに示す値の妥当な組み合わせを指定できます。
dwMaskTOUCHINPUTMASKF_MASK4+24+20構造体内のオプションのフィールドのうち、どれが有効な値を含んでいるかを指定するビットフラグのセットです。オプションのフィールドで有効な情報が利用できるかどうかはデバイス固有です。アプリケーションは、dwMask で対応するビットが設定されている場合にのみ、オプションのフィールドの値を使用してください。このフィールドには、解説セクションに示す dwMask フラグの組み合わせを含めることができます。
dwTimeDWORD4+28+24イベントのタイムスタンプ (ミリ秒単位) です。このフィールドに対してシステムは一切の検証を行わないことに注意してください。TOUCHINPUTMASKF_TIMEFROMSYSTEM フラグが設定されていない場合、このフィールドの値の正確さと順序は、完全にタッチ入力プロバイダーに依存します。
dwExtraInfoUINT_PTR8/4+32+28タッチイベントに関連付けられた追加の値です。
cxContactDWORD4+40+32タッチの接触領域の幅で、物理画面座標におけるピクセルの 100 分の 1 単位で表されます。この値は、dwMask メンバーに TOUCHEVENTFMASK_CONTACTAREA フラグが設定されている場合にのみ有効です。
cyContactDWORD4+44+36タッチの接触領域の高さで、物理画面座標におけるピクセルの 100 分の 1 単位で表されます。この値は、dwMask メンバーに TOUCHEVENTFMASK_CONTACTAREA フラグが設定されている場合にのみ有効です。

公式ドキュメント

タッチ入力のデータをカプセル化します。

解説(Remarks)

次の表は、dwFlags メンバーに指定できるフラグの一覧です。

フラグ 説明
TOUCHEVENTF_MOVE 0x0001 移動が発生しました。TOUCHEVENTF_DOWN と組み合わせることはできません。
TOUCHEVENTF_DOWN 0x0002 対応するタッチポイントが新しい接触によって確立されました。TOUCHEVENTF_MOVE または TOUCHEVENTF_UP と組み合わせることはできません。
TOUCHEVENTF_UP 0x0004 タッチポイントが取り除かれました。
TOUCHEVENTF_INRANGE 0x0008 タッチポイントが範囲内にあります。このフラグは、対応するハードウェアでタッチのホバーサポートを有効にするために使用されます。ホバーのサポートが不要なアプリケーションは、このフラグを無視できます。
TOUCHEVENTF_PRIMARY 0x0010 この TOUCHINPUT 構造体がプライマリ接触点に対応することを示します。プライマリタッチポイントの詳細については、以降の説明を参照してください。
TOUCHEVENTF_NOCOALESCE 0x0020 GetTouchInputInfo を使用して受け取った場合、この入力は結合されていません。
TOUCHEVENTF_PEN 0x0040 タッチイベントはスタイラスデバイスによって発生しました。
TOUCHEVENTF_PALM 0x0080 タッチイベントはユーザーの手のひらによって発生しました。
メモ マシンの対象ハードウェアがホバーをサポートしていない場合、TOUCHEVENTF_UP フラグが設定されると TOUCHEVENTF_INRANGE フラグはクリアされます。 マシンの対象ハードウェアがホバーをサポートしている場合、TOUCHEVENTF_UP フラグと TOUCHEVENTF_INRANGE フラグはそれぞれ独立して設定されます。
次の表は、dwMask メンバーに指定できるフラグの一覧です。
フラグ 説明
TOUCHINPUTMASKF_CONTACTAREA 0x0004 cxContactcyContact が有効です。プライマリタッチポイントの詳細については、以降の説明を参照してください。
TOUCHINPUTMASKF_EXTRAINFO 0x0002 dwExtraInfo が有効です。
TOUCHINPUTMASKF_TIMEFROMSYSTEM 0x0001 システム時刻が TOUCHINPUT 構造体に設定されました。

タッチポイントは、タッチポイントが 1 つも存在しない状態から最初に確立されたときに、プライマリとして指定されます。 TOUCHEVENTF_PRIMARY フラグは、プライマリタッチポイントが解放されるまで、 そのタッチポイントに対する後続のすべてのイベントで設定され続けます。プライマリタッチポイントでの TOUCHEVENTF_UP イベントは、 必ずしも Windows タッチ操作の終了を示すわけではないことに注意してください。現在の Windows タッチ操作は、プライマリタッチポイントが確立されてから 最後のタッチポイントが解放されるまで続きます。

単独のタッチポイント、または同時に発生した複数のタッチポイントのうち最初に検出されたものが、プライマリとして指定されることに注意してください。システムのマウス位置はプライマリタッチポイントに追従し、タッチメッセージに加えて、プライマリタッチポイントに対する操作に応じて WM_LBUTTONDOWNWM_MOUSEMOVEWM_LBUTTONUP の各メッセージも生成します。また、プライマリタッチポイントは、press and hold ジェスチャによって WM_RBUTTONDOWN および WM_RBUTTONUP メッセージを生成することもあります。

タッチポイント識別子は動的である可能性があり、そのタッチポイントが存続している間だけ関連付けられることに注意してください。接触がいったん途切れてから再開された場合 (たとえば、指を画面から離して再び押し下げた場合)、同じタッチポイント (同じ指、ペン、またはそれに類するデバイス) が異なるタッチポイント識別子を受け取ることがあります。

TOUCHINPUT 構造体への定数ポインターを表すために、次の型が定義されています。


   typedef TOUCHINPUT const * PCTOUCHINPUT;
    

メモ 次の例では、pInputs 配列はソートされていません。特定のタッチポイントを追跡するには、dwID の値を使用してください。
UINT cInputs = LOWORD(wParam);
PTOUCHINPUT pInputs = new TOUCHINPUT[cInputs];
if (NULL != pInputs)
{
    if (GetTouchInputInfo((HTOUCHINPUT)lParam,
                          cInputs,
                          pInputs,
                          sizeof(TOUCHINPUT)))
    {
        // process pInputs
        if (!CloseTouchInputHandle((HTOUCHINPUT)lParam))
        {
            // error handling
        }
    }
    else
    {
        // GetLastError() and error handling
    }
    delete [] pInputs;
}
else
{
    // error handling, presumably out of memory
}
return DefWindowProc(hWnd, message, wParam, lParam);

次の例は、hSource メンバーからデバイス情報を取得する方法を示しています。この例では、デバイスに関する情報を取得するために GetRawInputDevice を使用します。

for (UINT i = 0; i < cInputs; i++){
  TOUCHINPUT ti = pInputs[i];      
  RID_DEVICE_INFO info;
  ZeroMemory(&info, sizeof(RID_DEVICE_INFO));
  info.cbSize = sizeof(RID_DEVICE_INFO);
  UINT size = 0;
  if (GetRawInputDeviceInfo(ti.hSource, RIDI_DEVICEINFO, &info, &size)){
  }else{
    DWORD err = GetLastError();
  }
}
出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)

各言語での定義

#include <windows.h>

// TOUCHINPUT  (x64 48 / x86 40 バイト)
typedef struct TOUCHINPUT {
    INT x;
    INT y;
    HANDLE hSource;
    DWORD dwID;
    TOUCHEVENTF_FLAGS dwFlags;
    TOUCHINPUTMASKF_MASK dwMask;
    DWORD dwTime;
    UINT_PTR dwExtraInfo;
    DWORD cxContact;
    DWORD cyContact;
} TOUCHINPUT;
using System;
using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct TOUCHINPUT
{
    public int x;
    public int y;
    public IntPtr hSource;
    public uint dwID;
    public uint dwFlags;
    public uint dwMask;
    public uint dwTime;
    public UIntPtr dwExtraInfo;
    public uint cxContact;
    public uint cyContact;
}
Imports System.Runtime.InteropServices

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure TOUCHINPUT
    Public x As Integer
    Public y As Integer
    Public hSource As IntPtr
    Public dwID As UInteger
    Public dwFlags As UInteger
    Public dwMask As UInteger
    Public dwTime As UInteger
    Public dwExtraInfo As UIntPtr
    Public cxContact As UInteger
    Public cyContact As UInteger
End Structure
import ctypes
from ctypes import wintypes

class TOUCHINPUT(ctypes.Structure):
    _fields_ = [
        ("x", ctypes.c_int),
        ("y", ctypes.c_int),
        ("hSource", ctypes.c_void_p),
        ("dwID", wintypes.DWORD),
        ("dwFlags", wintypes.DWORD),
        ("dwMask", wintypes.DWORD),
        ("dwTime", wintypes.DWORD),
        ("dwExtraInfo", ctypes.c_size_t),
        ("cxContact", wintypes.DWORD),
        ("cyContact", wintypes.DWORD),
    ]
#[repr(C)]
pub struct TOUCHINPUT {
    pub x: i32,
    pub y: i32,
    pub hSource: *mut core::ffi::c_void,
    pub dwID: u32,
    pub dwFlags: u32,
    pub dwMask: u32,
    pub dwTime: u32,
    pub dwExtraInfo: usize,
    pub cxContact: u32,
    pub cyContact: u32,
}
import "golang.org/x/sys/windows"

type TOUCHINPUT struct {
	x int32
	y int32
	hSource uintptr
	dwID uint32
	dwFlags uint32
	dwMask uint32
	dwTime uint32
	dwExtraInfo uintptr
	cxContact uint32
	cyContact uint32
}
type
  TOUCHINPUT = record
    x: Integer;
    y: Integer;
    hSource: Pointer;
    dwID: DWORD;
    dwFlags: DWORD;
    dwMask: DWORD;
    dwTime: DWORD;
    dwExtraInfo: NativeUInt;
    cxContact: DWORD;
    cyContact: DWORD;
  end;
const TOUCHINPUT = extern struct {
    x: i32,
    y: i32,
    hSource: ?*anyopaque,
    dwID: u32,
    dwFlags: u32,
    dwMask: u32,
    dwTime: u32,
    dwExtraInfo: usize,
    cxContact: u32,
    cyContact: u32,
};
type
  TOUCHINPUT {.bycopy.} = object
    x: int32
    y: int32
    hSource: pointer
    dwID: uint32
    dwFlags: uint32
    dwMask: uint32
    dwTime: uint32
    dwExtraInfo: uint
    cxContact: uint32
    cyContact: uint32
struct TOUCHINPUT
{
    int x;
    int y;
    void* hSource;
    uint dwID;
    uint dwFlags;
    uint dwMask;
    uint dwTime;
    size_t dwExtraInfo;
    uint cxContact;
    uint cyContact;
}

HSP用 定義

HSP3.7/3.8 は構造体機能が無いため4byte整数配列(dim)+peek/poke で操作(32/64bitでサイズ・位置が異なる場合はタブで分割)。IronHSP は NSTRUCT(#defstruct/stdim/->)で32/64bit共通。

; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x86 レイアウト)
; TOUCHINPUT サイズ: 40 バイト(x86)
dim st, 10    ; 4byte整数×10(構造体サイズ 40 / 4 切り上げ)
; x : INT (+0, 4byte)  st.0 = 値  /  値 = st.0   (lpoke/lpeek も可)
; y : INT (+4, 4byte)  st.1 = 値  /  値 = st.1   (lpoke/lpeek も可)
; hSource : HANDLE (+8, 4byte)  st.2 = 値  /  値 = st.2   (lpoke/lpeek も可)
; dwID : DWORD (+12, 4byte)  st.3 = 値  /  値 = st.3   (lpoke/lpeek も可)
; dwFlags : TOUCHEVENTF_FLAGS (+16, 4byte)  st.4 = 値  /  値 = st.4   (lpoke/lpeek も可)
; dwMask : TOUCHINPUTMASKF_MASK (+20, 4byte)  st.5 = 値  /  値 = st.5   (lpoke/lpeek も可)
; dwTime : DWORD (+24, 4byte)  st.6 = 値  /  値 = st.6   (lpoke/lpeek も可)
; dwExtraInfo : UINT_PTR (+28, 4byte)  st.7 = 値  /  値 = st.7   (lpoke/lpeek も可)
; cxContact : DWORD (+32, 4byte)  st.8 = 値  /  値 = st.8   (lpoke/lpeek も可)
; cyContact : DWORD (+36, 4byte)  st.9 = 値  /  値 = st.9   (lpoke/lpeek も可)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; TOUCHINPUT サイズ: 48 バイト(x64)
dim st, 12    ; 4byte整数×12(構造体サイズ 48 / 4 切り上げ)
; x : INT (+0, 4byte)  st.0 = 値  /  値 = st.0   (lpoke/lpeek も可)
; y : INT (+4, 4byte)  st.1 = 値  /  値 = st.1   (lpoke/lpeek も可)
; hSource : HANDLE (+8, 8byte)  qpoke st,8,値 / qpeek(st,8)  ※IronHSPのみ。3.7/3.8は lpoke st,8,下位 : lpoke st,12,上位
; dwID : DWORD (+16, 4byte)  st.4 = 値  /  値 = st.4   (lpoke/lpeek も可)
; dwFlags : TOUCHEVENTF_FLAGS (+20, 4byte)  st.5 = 値  /  値 = st.5   (lpoke/lpeek も可)
; dwMask : TOUCHINPUTMASKF_MASK (+24, 4byte)  st.6 = 値  /  値 = st.6   (lpoke/lpeek も可)
; dwTime : DWORD (+28, 4byte)  st.7 = 値  /  値 = st.7   (lpoke/lpeek も可)
; dwExtraInfo : UINT_PTR (+32, 8byte)  qpoke st,32,値 / qpeek(st,32)  ※IronHSPのみ。3.7/3.8は lpoke st,32,下位 : lpoke st,36,上位
; cxContact : DWORD (+40, 4byte)  st.10 = 値  /  値 = st.10   (lpoke/lpeek も可)
; cyContact : DWORD (+44, 4byte)  st.11 = 値  /  値 = st.11   (lpoke/lpeek も可)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
#defstruct global TOUCHINPUT
    #field int x
    #field int y
    #field intptr hSource
    #field int dwID
    #field int dwFlags
    #field int dwMask
    #field int dwTime
    #field intptr dwExtraInfo
    #field int cxContact
    #field int cyContact
#endstruct

stdim st, TOUCHINPUT        ; NSTRUCT 変数を確保
st->x = 100
mes "x=" + st->x