您的位置:首页 > 其它

Windows Touch应用程序疑难解答-中文整理

2013-05-04 23:47 459 查看

应用程序疑难解答

本节提供了针对常见问题的解决方法。

常规疑难解答

问题我正在运行 Windows Server 2008,但 Windows Touch 功能工作不正常。
原因您未启用“桌面体验”功能。
解决方法打开服务器管理器管理工具:单击“开始”,指向“管理工具”,然后单击“服务器管理器”。单击左列中的“功能”项。在“功能”部分中单击“添加功能”。选择“桌面体验”,单击“下一步”,然后单击“安装”。
问题每当我将手指快速移过应用程序时,都会出现一个箭头,并且我的笔势或操作未正确注册。
原因在不需要划动功能的情况下启用了划动功能。
解决方法在需要禁用划动功能时启用划动功能。有关禁用触笔画动功能的信息,请参见对使用滚动条进行平移的旧版支持
问题我无法区分鼠标输入和 Windows Touch 输入。
原因当用户在屏幕上单击时,Windows 会对旧版支持生成鼠标消息。
解决方法可为 WM_LBUTTONDOWNWM_LBUTTONUP 消息调用 GetMessageExtraInfo 以确定来源。以下代码演示如何执行此操作。
[code]
#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 上运行 Surface 应用程序?
原因Windows Touch 与 Microsoft Surface 不兼容。
解决方法您需要将 Windows 7 平台或 Microsoft Surface 平台作为目标。

操作和延时疑难解答

问题我的应用程序无缘无故地发生冻结情况。我在初始化我的对象接口时出现访问冲突情况。
原因在使用 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 版本。
[code]
#ifndef WINVER                  // Specify that the minimum required platform is Windows 7.
#define WINVER 0x0601           
#endif
问题我的触控输入 x 坐标和 y 坐标似乎无效。它们要么为大于期望值的值,要么为负值。
原因您可能需要将触控点转换为像素,或者可能需要转换屏幕坐标。
解决方法确保您正在调用 TOUCH_COORD_TO_PIXELScreenToClient。以下代码演示如何执行此操作。
[code]
      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 Touch 笔势疑难解答

问题我在处理 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 参考中所述的 WM_GESTURENOTIFY 消息时调用 SetGestureConfig,或者您需要为 WM_GESTURENOTIFY消息添加处理程序。以下代码说明如何实现一个处理程序以启用对旋转的支持。
[code]
// The message map.
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; // The gesture identifier.
    gc.dwWant  = GC_ROTATE;  // The gesture command you are enabling for GID_ROTATE.
    gc.dwBlock = 0;          // Don't block anything.
    UINT uiGcs = 1;          // The number of gestures being set.
     
    BOOL bResult = SetGestureConfig(g_hMainWnd, 0, uiGcs, &gc, sizeof(GESTURECONFIG));
    if(!bResult) {
        // Something went wrong, report the error using your preferred logging.
    }

    return 0;
}
有关典型笔势配置的更多示例,请参见 SetGestureConfig
问题当我执行平移笔势时,应用程序中的自定义滚动条未滚动。
原因缺少针对正确的 WM_*SCROLL 消息的处理程序。
解决方法您未处理自定义滚动条中的所有 WM_*SCROLL 消息。建议您处理 WM_GESTURE 消息,而不是通过旧版支持来保留自定义滚动条功能。您需要支持消息,如对使用滚动条进行平移的旧版支持部分中所述。
问题我遇到笔势延迟情况。
原因划动功能可能会导致笔势延迟。
解决方法划动功能会导致应用程序接收 WM_GESTURE 消息所用的时间出现延迟。有关禁用划动功能的信息,请参见对使用滚动条进行平移的旧版支持
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: