排除故障应用程序

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

常规故障排除

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

 

类别 说明
问题 每当我在应用程序中快速移动手指时,将会显示一个箭头,但我的手势或操作未能正确注册。
原因 在不需要时启用轻触功能。
解决方案 当你想禁用它时,却启用了轻触功能。 有关禁用笔触的信息,请参阅对使用滚动条平移的旧版支持

 

问题 我无法区分鼠标输入和 Windows Touch 输入。
原因 当用户单击屏幕上时,Windows 将为旧版支持生成鼠标消息。
解决方案 您可以为 WM_LBUTTONDOWNWM_LBUTTONUP 消息调用 GetMessageExtraInfo 来确定源。 下面的示例演示了如何实现这一点。

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 平台。

 

操作和惯性疑难解答

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

 

类别 说明
问题 我的对象在平移时旋转不正确。 单指旋转无法正常工作。
原因 在物体上不正确地设置枢轴。
解决方案 您未正确设置操作透视点。 将 PivotPointXPivotPointY 属性设置为要围绕旋转的对象或点的中心,并将 PivotRadius 属性设置为对象的半径。

 

Windows Touch 输入疑难解答

类别 说明
问题 处理 WM_TOUCH 消息后,我就不再受到边界反馈了。
原因 使用 WM_TOUCH 消息而不处理它。
解决方案 您可能在使用 Windows Touch 消息而没有将其转发到 DefWindowProc,这将导致意外行为。 有关如何正确处理 WM_TOUCH 消息的详细信息,请查看 Windows 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 的详细信息,请参阅高 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,这将导致意外行为。 有关如何正确处理 WM_GESTURE 消息的详细信息,请查看 Windows 手势入门

 

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

 

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

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)); if(!bResult) { // 出现问题,请使用首选日志记录报告错误。 }

return 0; }

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

 

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

 

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

 

编程指南