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

来源:互联网 发布:xp关闭445端口的方法 编辑:程序博客网 时间:2024/06/06 23:55

应用程序疑难解答

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

常规疑难解答

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

 

问题每当我将手指快速移过应用程序时,都会出现一个箭头,并且我的笔势或操作未正确注册。原因在不需要划动功能的情况下启用了划动功能。解决方法在需要禁用划动功能时启用划动功能。有关禁用触笔画动功能的信息,请参见对使用滚动条进行平移的旧版支持。

 

问题我无法区分鼠标输入和 Windows Touch 输入。原因当用户在屏幕上单击时,Windows 会对旧版支持生成鼠标消息。解决方法可为 WM_LBUTTONDOWN 和 WM_LBUTTONUP 消息调用 GetMessageExtraInfo 以确定来源。以下代码演示如何执行此操作。
#define MOUSEEVENTF_FROMTOUCH 0xFF515700if ((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 平台作为目标。

 

操作和延时疑难解答

问题我的应用程序无缘无故地发生冻结情况。我在初始化我的对象接口时出现访问冲突情况。原因在使用 IManipulationProcessor 或 IInertiaProcessor 接口时缺少对 CoInitialize 的调用。解决方法在不调用 CoInitialize 的情况下实例化 Windows Touch 组件对象模型 (COM) 对象会导致出现此情况。在将项目从使用笔势转换为使用操作或延时接口时,有时会发生此情况。

 

问题我的对象在转换过程中出现了错误旋转。单指旋转无法正常工作。原因为对象设置的转轴不正确。解决方法您未正确设置操作枢轴点。将 PivotPointX 和 PivotPointY 属性设置为对象中心或要绕其旋转的点,并将 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 版本。
#ifndef WINVER                  // Specify that the minimum required platform is Windows 7.#define WINVER 0x0601           #endif

 

问题我的触控输入 x 坐标和 y 坐标似乎无效。它们要么为大于期望值的值,要么为负值。原因您可能需要将触控点转换为像素,或者可能需要转换屏幕坐标。解决方法确保您正在调用 TOUCH_COORD_TO_PIXEL 和 ScreenToClient。以下代码演示如何执行此操作。
      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_TOUCH 和 WM_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_TOUCH 和 WM_GESTURE 消息是互斥的。如果调用 RegisterTouchWindow,则将不会收到 WM_GESTURE 消息。

 

问题我未看到应显示的所有笔势。例如,我看到了标识符为 GID_PAN 的笔势,但没有看到标识符为 GID_ROTATE 的笔势。原因默认情况下,不启用某些笔势(如旋转笔势)。解决方法您需要在接收 WM_GESTURENOTIFY 参考中所述的 WM_GESTURENOTIFY 消息时调用 SetGestureConfig,或者您需要为 WM_GESTURENOTIFY消息添加处理程序。以下代码说明如何实现一个处理程序以启用对旋转的支持。
// 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 消息所用的时间出现延迟。有关禁用划动功能的信息,请参见对使用滚动条进行平移的旧版支持。