编程指南:应用程序疑难解答

本文提供了解决WindowsTouch在WindowsServer2008及Windows7上遇到的各类问题的方法,包括功能异常、操作延时、输入反馈及笔势识别等常见问题。

应用程序疑难解答

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

常规疑难解答

        问题:我正在运行Windows Server 2008,但Windows Toch功能工作不正常。

        原因:你未启用“桌面体验”功能。

        解决方法:打开服务器管理器管理工具:单击“开始”,指向“管理工具”,然后单击“服务器管理器”。单击左列中的“功能”项。在“功能”部分中单击“添加功能”。选择“桌面体验”,单击“下一步”,然后单击“安装”。


        问题:每当我将手指快速移过应用程序时,都会出现一个箭头,并且我的笔势或操作未正确注册。

        原因:在不需要划动功能的情况下启用了划动功能。、

        解决方法:在需要禁用划动功能时启用划动功能。有关禁用触笔划动功能的信息,请参见对使用滚动条进行平移的旧版支持。


        问题:我无法区分鼠标输入和Windows Touch输入。

        原因:当用户在屏幕上单击时,Windows会对旧版支持生成鼠标消息。

        解决方案:可为WM_LBUTTONDOWN和WM_LBUTTONUP消息调用GetMessageExtraInfo以确定来源。以下代码延时如何执行此操作。

#define MOUSEEVENTF_FROMTOUCH 0xFF545700
if( (GetMessageExtraInfo() & MOUSEEVENTF_FROMTOUCH) == MOSUEEVENTF_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或IInertialProcessor接口时缺少对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_GESTRUE消息的更多信息,请参见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_GESTURENOTITY消息添加处理程序。以下代码说明如何实现一个处理程序以启用对旋转的支持。

// The message map.
BEGIN_MESSAGE_MAP()
    ON_WM_CREATE()
    ... ... ...
    ON_MESSAGE( WM_GESTURENOTIFY, OnWindowsGetstureNotity )
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消息所用的时间出现延迟。有关禁用划动功能,请参见对使用滚动条进行平移的旧版支持。


http://msdn.microsoft.com/zh-cn/library/windows/desktop/dd693088(v=vs.85).aspx

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值