应用程序疑难解答

本部分提供常见问题的解决方案。

常规故障排除

类别 说明
问题 我正在运行 Windows Server 2008,并且 Windows Touch 功能不起作用。
原因 你尚未启用桌面体验。
解决方案 打开服务器管理器管理工具:单击“开始”,指向“管理工具”,然后单击“服务器管理器”。 单击左侧列中的 “功能” 项。 单击 “功能 ”部分中的“添加 功能 ”。 选择“ 桌面体验”,单击“ 下一步”,然后单击“ 安装”。

 

类别 说明
问题 每当我在应用程序中快速移动手指时,都会出现一个箭头,并且手势或操作未正确注册。
原因 在不需要时启用轻拂。
解决方案 当你希望禁用它时,你已启用轻拂。 有关禁用笔击的信息,请参阅 旧版支持使用滚动条平移

 

问题 我无法辨别鼠标输入和 Windows Touch 输入。
原因 当用户单击屏幕时,Windows 会生成鼠标消息以获取旧版支持。
解决方案 可以为WM_LBUTTONDOWN调用 GetMessageExtraInfo,并WM_LBUTTONUP消息来确定源。 以下代码演示如何执行此操作。

C++
#define MOUSEEVENTF_FROMTOUCH 0xFF515700

if ((GetMessageExtraInfo() & MOUSEEVENTF_FROMTOUCH) == MOUSEEVENTF_FROMTOUCH) { // Click was generated by wisptis / Windows Touch }else{ // Click was generated by the mouse. }

 

类别 说明
问题 如何实现 Windows 7 上运行 Microsoft PixelSense 应用程序?
原因 Windows Touch 和 Microsoft PixelSense 不兼容。
解决方案 你需要面向 Windows 7 平台或 Microsoft PixelSense 平台。

 

操作和惯性疑难解答

类别 说明
问题 我的应用程序无缘无故冻结。 初始化对象接口时遇到访问冲突。
原因 在使用 IManipulationProcessor 或 IInertiaProcessor 接口时缺少对 CoInitialize调用。
解决方案 这可能是由于在不调用 CoInitialize 的情况下将 Windows Touch 组件对象模型实例化 (COM) 对象导致的。 将项目从使用手势转换为使用操作或惯性接口时,有时会发生这种情况。

 

类别 说明
问题 我的对象在翻译时旋转不当。 单指旋转无法正常工作。
原因 错误地在对象上设置透视。
解决方案 未正确设置操作透视点。 将 PivotPointXPivotPointY 属性设置为要旋转的对象或点的中心,并将 PivotRadius 属性设置为对象的半径。

 

Windows 触控输入疑难解答

类别 说明
问题 处理 WM_TOUCH 消息后,我停止获取边界反馈。
原因 使用 WM_TOUCH 消息而不处理它。
解决方案 你可能在未将 Windows Touch 消息转发到 DefWindowProc 的情况下使用 Windows Touch 消息,这将导致意外行为。 请查看 Windows 触控消息入门,详细了解如何正确处理WM_TOUCH消息。

 

问题 我包含 windows.h,但它仍然说 WM_TOUCH 未定义。
原因 Targetver.h 中的 Windows 版本不正确。
解决方案 你尚未在项目中设置正确的 Windows 版本。 以下代码演示了在 Windows 7 中正确设置 Windows Touch 的 Windows 版本。
C++
#ifndef WINVER                  // Specify that the minimum required platform is Windows 7.
#define WINVER 0x0601           
#endif

 

问题 我的触摸输入 x 坐标和 y 坐标似乎无效。 它们要么大于预期值,要么是负值。
原因 可能需要将触摸点转换为像素,或者可能需要转换屏幕坐标。
解决方案 请确保调用 TOUCH_COORD_TO_PIXELScreenToClient。 下面的代码演示如何执行此操作。
C++
      POINT ptInput;
      if (GetTouchInputInfo((HTOUCHINPUT)lParam, cInputs, pInputs, sizeof(TOUCHINPUT))){
        for (int i=0; i < static_cast<INT>(cInputs); i++){
          TOUCHINPUT ti = pInputs[i];                       
          if (ti.dwID != 0){                
            // Do something with your touch input handle.
            ptInput.x = TOUCH_COORD_TO_PIXEL(ti.x);
            ptInput.y = TOUCH_COORD_TO_PIXEL(ti.y);
            ScreenToClient(hWnd, &ptInput);
            points[ti.dwID][0] = ptInput.x;
            points[ti.dwID][1] = ptInput.y;
          }
        }
      }

注意:
若要使用 ScreenToClient 函数,必须在应用程序中提供高 DPI 支持。 有关支持高 DPI 的详细信息,请访问 MSDN 的高 DPI 部分。

 

 

类别 说明
问题 我没有看到 WM_TOUCH 消息,但我知道 Windows Touch 正在运行,因为我看到 WM_GESTURE 消息。
原因 缺少对 RegisterTouchWindow 的调用。
解决方案 WM_TOUCHWM_GESTURE 消息是互斥的。 如果不调用 RegisterTouchWindow,则只会收到 WM_GESTURE 消息。

 

类别 说明
问题 从触摸手指到在应用程序中收到输入时,我注意到有一些延迟。
原因 手掌排斥导致输入延迟。
解决方案 如果在对 RegisterTouchWindow 的调用中设置了TWF_WANTPALM,则启用手掌拒绝。 这会导致 (100 毫秒) 延迟,而软件测试输入来自手指、笔还是用户的手掌。 通过调用 RegisterTouchWindow 禁用手掌拒绝,并清除 了TWF_WANTPALM 标志。

 

Windows 触控手势疑难解答

类别 说明
问题 处理 WM_GESTURE 消息后,我停止获取边界反馈。 或者,以前工作的手势现在不起作用。
原因 使用 WM_GESTURE 消息而不处理它。
解决方案 你可能在未将 Windows Touch 消息转发到 DefWindowProc 的情况下使用 Windows Touch 消息,这将导致意外行为。 有关如何正确处理WM_GESTURE消息的详细信息,请查看 windows 手势入门

 

类别 说明
问题 我没有看到 WM_GESTURE 消息,但我知道 Windows Touch 正在运行,因为我看到 WM_TOUCH 消息。
原因 调用 RegisterTouchWindow
解决方案 WM_TOUCHWM_GESTURE 消息是互斥的。 如果调用 RegisterTouchWindow,则不会收到 WM_GESTURE 消息。

 

问题 我没有看到我期望看到的所有手势。 例如,我看到具有标识符 的手势GID_PAN 但不 GID_ROTATE
原因 默认情况下,某些手势(如旋转手势)未启用。
解决方案 收到WM_GESTURENOTIFY消息(如WM_GESTURENOTIFY参考中所述),或者需要为WM_GESTURENOTIFY消息添加处理程序时,需要调用 SetGestureConfig。 以下代码演示如何实现处理程序以启用对轮换的支持。

C++
消息映射。BEGIN_MESSAGE_MAP () ON_WM_CREATE () ... ... ...ON_MESSAGE (WM_GESTURENOTIFY,OnWindowsGestureNotify) END_MESSAGE_MAP () 

LRESULT CTestWndApp::OnWindowsGestureNotify ( UINT uMsg、WPARAM wParam、LPARAM lParam、BOOL& bHandled ) { GESTURECONFIG gc; gc.dwID = GID_ROTATE; // 手势标识符。 gc.dwWant = GC_ROTATE;要为GID_ROTATE启用的手势命令。 gc.dwBlock = 0;不要阻止任何内容。 UINT uiGcs = 1;正在设置的手势数。

BOOL bResult = SetGestureConfig (g_hMainWnd, 0, uiGcs, &gc, sizeof (GESTURECONFIG) ) ;如果 (!bResult) { // 出现问题,请使用首选日志记录报告错误。 }

return 0; }

有关典型手势配置的更多示例,请参阅 SetGestureConfig

 

类别 说明
问题 执行平移手势时,应用程序中的自定义滚动条不会滚动。
原因 缺少正确WM_*SCROLL 消息的处理程序。
解决方案 你未在自定义滚动条中处理所有WM_*SCROLL 消息。 建议处理 WM_GESTURE 消息,而不是通过旧版支持保留自定义滚动条功能。 需要支持消息,详见 使用滚动条进行平移的旧版支持部分。

 

类别 说明
问题 我因手势而出现延迟。
原因 轻拂可能会导致手势延迟。
解决方案 轻拂可能会导致应用程序接收 WM_GESTURE 消息所花费的时间延迟。 有关禁用轻 拂的信息,请参阅旧版支持使用滚动条平移

 

编程指南