TOUCHINPUT
構造体サイズ=各フィールドのバイト数(x64/x86 で異なる場合は x64/x86 と併記)。x64/x86 列=フィールドのバイトオフセット(HSPで dupptr / lpoke / wpoke 等に使用)。
フィールド
| フィールド | 型 | サイズ | x64 | x86 | 説明 |
|---|---|---|---|---|---|
| x | INT | 4 | +0 | +0 | タッチ入力の x 座標 (水平方向の位置) です。このメンバーは、物理画面座標におけるピクセルの 100 分の 1 単位で示されます。 |
| y | INT | 4 | +4 | +4 | タッチ入力の y 座標 (垂直方向の位置) です。このメンバーは、物理画面座標におけるピクセルの 100 分の 1 単位で示されます。 |
| hSource | HANDLE | 8/4 | +8 | +8 | 入力元デバイスのデバイスハンドルです。各デバイスには、実行時にタッチ入力プロバイダーによって一意のプロバイダーが割り当てられます。以下の 例 のセクションを参照してください。 |
| dwID | DWORD | 4 | +16 | +12 | 特定のタッチ入力を識別するタッチポイント識別子です。この値は、接触が開始してから離れるまでのタッチ接触シーケンスの間、一貫して保たれます。ID は、後続の接触で再利用されることがあります。 |
| dwFlags | TOUCHEVENTF_FLAGS | 4 | +20 | +16 | タッチポイントの押下、解放、移動に関するさまざまな側面を指定するビットフラグのセットです。このメンバーのビットには、解説セクションに示す値の妥当な組み合わせを指定できます。 |
| dwMask | TOUCHINPUTMASKF_MASK | 4 | +24 | +20 | 構造体内のオプションのフィールドのうち、どれが有効な値を含んでいるかを指定するビットフラグのセットです。オプションのフィールドで有効な情報が利用できるかどうかはデバイス固有です。アプリケーションは、dwMask で対応するビットが設定されている場合にのみ、オプションのフィールドの値を使用してください。このフィールドには、解説セクションに示す dwMask フラグの組み合わせを含めることができます。 |
| dwTime | DWORD | 4 | +28 | +24 | イベントのタイムスタンプ (ミリ秒単位) です。このフィールドに対してシステムは一切の検証を行わないことに注意してください。TOUCHINPUTMASKF_TIMEFROMSYSTEM フラグが設定されていない場合、このフィールドの値の正確さと順序は、完全にタッチ入力プロバイダーに依存します。 |
| dwExtraInfo | UINT_PTR | 8/4 | +32 | +28 | タッチイベントに関連付けられた追加の値です。 |
| cxContact | DWORD | 4 | +40 | +32 | タッチの接触領域の幅で、物理画面座標におけるピクセルの 100 分の 1 単位で表されます。この値は、dwMask メンバーに TOUCHEVENTFMASK_CONTACTAREA フラグが設定されている場合にのみ有効です。 |
| cyContact | DWORD | 4 | +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 | タッチイベントはユーザーの手のひらによって発生しました。 |
| フラグ | 値 | 説明 |
|---|---|---|
| TOUCHINPUTMASKF_CONTACTAREA | 0x0004 | cxContact と cyContact が有効です。プライマリタッチポイントの詳細については、以降の説明を参照してください。 |
| TOUCHINPUTMASKF_EXTRAINFO | 0x0002 | dwExtraInfo が有効です。 |
| TOUCHINPUTMASKF_TIMEFROMSYSTEM | 0x0001 | システム時刻が TOUCHINPUT 構造体に設定されました。 |
タッチポイントは、タッチポイントが 1 つも存在しない状態から最初に確立されたときに、プライマリとして指定されます。 TOUCHEVENTF_PRIMARY フラグは、プライマリタッチポイントが解放されるまで、 そのタッチポイントに対する後続のすべてのイベントで設定され続けます。プライマリタッチポイントでの TOUCHEVENTF_UP イベントは、 必ずしも Windows タッチ操作の終了を示すわけではないことに注意してください。現在の Windows タッチ操作は、プライマリタッチポイントが確立されてから 最後のタッチポイントが解放されるまで続きます。
単独のタッチポイント、または同時に発生した複数のタッチポイントのうち最初に検出されたものが、プライマリとして指定されることに注意してください。システムのマウス位置はプライマリタッチポイントに追従し、タッチメッセージに加えて、プライマリタッチポイントに対する操作に応じて WM_LBUTTONDOWN、WM_MOUSEMOVE、WM_LBUTTONUP の各メッセージも生成します。また、プライマリタッチポイントは、press and hold ジェスチャによって WM_RBUTTONDOWN および WM_RBUTTONUP メッセージを生成することもあります。
タッチポイント識別子は動的である可能性があり、そのタッチポイントが存続している間だけ関連付けられることに注意してください。接触がいったん途切れてから再開された場合 (たとえば、指を画面から離して再び押し下げた場合)、同じタッチポイント (同じ指、ペン、またはそれに類するデバイス) が異なるタッチポイント識別子を受け取ることがあります。
TOUCHINPUT 構造体への定数ポインターを表すために、次の型が定義されています。
typedef TOUCHINPUT const * PCTOUCHINPUT;
例
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 公式リファレンス: 英語 (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 Structureimport 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: uint32struct 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