应用程序疑难解答
本节提供了针对常见问题的解决方法。
常规疑难解答
问题 | 我正在运行 Windows Server 2008,但 Windows Touch 功能工作不正常。 |
---|
原因 | 您未启用“桌面体验”功能。 |
---|
解决方法 | 打开服务器管理器管理工具:单击“开始”,指向“管理工具”,然后单击“服务器管理器”。单击左列中的“功能”项。在“功能”部分中单击“添加功能”。选择“桌面体验”,单击“下一步”,然后单击“安装”。 |
---|
问题 | 每当我将手指快速移过应用程序时,都会出现一个箭头,并且我的笔势或操作未正确注册。 |
---|
原因 | 在不需要划动功能的情况下启用了划动功能。 |
---|
解决方法 | 在需要禁用划动功能时启用划动功能。有关禁用触笔画动功能的信息,请参见对使用滚动条进行平移的旧版支持。 |
---|
问题 | 我无法区分鼠标输入和 Windows Touch 输入。 |
---|
原因 | 当用户在屏幕上单击时,Windows 会对旧版支持生成鼠标消息。 |
---|
解决方法 | 可为 WM_LBUTTONDOWN 和 WM_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 平台作为目标。 |
---|
操作和延时疑难解答
问题 | 我的应用程序无缘无故地发生冻结情况。我在初始化我的对象接口时出现访问冲突情况。 |
---|
原因 | 在使用 IManipulationProcessor 或 IInertiaProcessor 接口时缺少对 CoInitialize 的调用。 |
---|
解决方法 | 在不调用 CoInitialize 的情况下实例化 Windows Touch 组件对象模型 (COM) 对象会导致出现此情况。在将项目从使用笔势转换为使用操作或延时接口时,有时会发生此情况。 |
---|
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_PIXEL 和 ScreenToClient。以下代码演示如何执行此操作。[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(可能为英文网页)部分。 |
---|
问题 | 我注意到,从我的手指按下到我从应用程序获取输入这一过程出现了少量延迟。 |
---|
原因 | 防手掌误触功能导致输入出现延迟。 |
---|
解决方法 | 如果在对 RegisterTouchWindow 的调用中设置 TWF_WANTPALM,则将启用防手掌误触功能。这会导致软件测试输入是来自手指、触笔还是用户手掌,从而出现些许(100 毫秒)延迟。可通过调用 RegisterTouchWindow 并清除 TWF_WANTPALM 标志来禁用防手掌误触功能。 |
---|
Windows Touch 笔势疑难解答
问题 | 我未看到应显示的所有笔势。例如,我看到了标识符为 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 消息,而不是通过旧版支持来保留自定义滚动条功能。您需要支持消息,如对使用滚动条进行平移的旧版支持部分中所述。 |
---|
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理