touchINPUT 结构 (winuser.h)

封装触摸输入的数据。

语法

typedef struct tagTOUCHINPUT {
  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_MOVETOUCHEVENTF_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_UPTOUCHEVENTF_INRANGE 标志。
 
下表列出了 dwMask 成员的标志。
标志 说明
TOUCHINPUTMASKF_CONTACTAREA 0x0004 cxContactcyContact 有效。 有关主要接触点的详细信息,请参阅以下文本。
TOUCHINPUTMASKF_EXTRAINFO 0x0002 dwExtraInfo 有效。
TOUCHINPUTMASKF_TIMEFROMSYSTEM 0x0001 系统时间是在 TOUCHINPUT 结构中设置的。
 

当触摸点是从以前没有触摸点的状态建立的第一个触摸点时,该触摸点被指定为主接触点。 继续为主要触摸点的所有后续事件设置 TOUCHEVENTF_PRIMARY 标志,直到释放主要触摸点。 请注意,主要触摸点上的 TOUCHEVENTF_UP 事件不一定指定 Windows 触控操作的结束;当前 Windows 触控操作从主要触摸点的建立到释放最后一个触摸点为止。

请注意,在一组同时检测的第一个触摸点中,单独的触摸点或被指定为主接触点。 系统鼠标位置遵循主要触摸点,除了触摸消息之外,还会生成 WM_LBUTTONDOWNWM_MOUSEMOVEWM_LBUTTONUP 消息,以响应主要触摸点上的操作。 主要触摸点还可以使用长按手势生成 WM_RBUTTONDOWNWM_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();
  }
}

要求

要求
最低受支持的客户端 Windows 7 [仅限桌面应用]
最低受支持的服务器 Windows Server 2008 R2 [仅限桌面应用]
标头 winuser.h (包括 Windows.h)

另请参阅

GetTouchInputInfo

结构