封装触控输入的数据。
语法
- typedef struct _TOUCHINPUT {
- LONG x;
- LONG y;
- HANDLE hSource;
- DWORD dwID;
- DWORD dwFlags;
- DWORD dwMask;
- DWORD dwTime;
- ULONG_PTR dwExtraInfo;
- DWORD cxContact;
- DWORD cyContact;
- } TOUCHINPUT, *PTOUCHINPUT;
成员
-
x
-
触控输入的 x 坐标(水平点)。此成员用物理屏幕坐标的像素的百分之一表示。
y
-
触控输入的 y 坐标(垂直点)。此成员用物理屏幕坐标的像素的百分之一表示。
hSource
-
源输入设备的设备句柄。触控输入提供程序在运行时为每个设备指定一个唯一的提供程序。
dwID
-
一个用于区别某个特定触控输入的触控点标识符。此值在触控点序列中从触控点下降到重新上升的整个过程中保持一致。稍后可对后续触控点重用一个 ID。
dwFlags
-
一组位标志,用于指定触控点按住、释放和移动的各个方面。此成员中的位可以是“备注”部分中的值的任何合理组合。
dwMask
-
一组位标志,用于指定结构中包含有效值的可选字段。可选字段中的有效信息的可用性是特定于设备的。应用程序应仅在 dwMask 中设置相应位时使用可选字段值。此字段可以包含“备注”部分中提到的 dwMask 标记的组合。
dwTime
-
事件的时间戳(以毫秒为单位)。使用方应用程序应通知系统不对此字段进行验证;如果未设置 TOUCHINPUTMASKF_TIMEFROMSYSTEM 标志,则此字段中的值的准确性和排序完全依赖于触控输入提供程序。
dwExtraInfo
-
与触控事件关联的其他值。
cxContact
-
触控区域的宽度用物理屏幕坐标的像素的百分之一表示。只有在 dwMask 成员设置了 TOUCHEVENTFMASK_CONTACTAREA 标记的情况下,此值才会有效。
cyContact
-
触控区域的高度用物理屏幕坐标的像素的百分之一表示。只有在 dwMask 成员设置了 TOUCHEVENTFMASK_CONTACTAREA 标记的情况下,此值才会有效。
评论
下表列出了 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_PALM | 0x0080 | 触控事件来自用户的手掌。 |
注意 如果计算机上的目标硬件不支持悬停,则在设置 TOUCHEVENTF_UP 标志时,将清除 TOUCHEVENTF_INRANGE 标志。如果计算机上的目标硬件支持悬停,则将单独设置 TOUCHEVENTF_UP 和 TOUCHEVENTF_INRANGE 标志。
下表列出了 dwMask 成员的标志。
标志 | 值 | 说明 |
---|---|---|
TOUCHINPUTMASKF_CONTACTAREA | 0x0004 | cxContact 和 cyContact 都有效。有关主触控点的更多信息,请参见以下文本。 |
TOUCHINPUTMASKF_EXTRAINFO | 0x0002 | dwExtraInfo 有效。 |
TOUCHINPUTMASKF_TIMEFROMSYSTEM | 0x0001 | 已在 TOUCHINPUT 结构中设置系统时间。 |
若某个触控点是从之前的无触控点状态创建的第一个触控点,则将其指定为主触控点。继续为主触控点的所有后续事件设置 TOUCHEVENTF_PRIMARY 标志,直到释放主触控点。请注意,主触控点上的 TOUCHEVENTF_UP 事件无需指定 Windows Touch 操作的结尾;当前的 Windows Touch 操作从创建主触控点开始执行,直到释放最后的触控点。
请注意,单独的触摸点或同步触控点集中要检测的第一个触摸点将指定为主触控点。系统鼠标位置将紧跟主触控点,并且(除生成触控消息之外)还将生成 WM_LBUTTONDOWN、WM_MOUSEMOVE 和 WM_LBUTTONUP 消息以响应主触控点上的操作。主触控点还可使用按住笔势生成 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
- }
- }
- 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();
- }
- }
要求
最低支持的客户端 | Windows 7 |
---|---|
最低支持的服务器 | Windows Server 2008 R2 |
标头 | Winuser.h (包括Windows.h) |