Поделиться через


Устранение неполадок приложений

В этом разделе приводятся решения распространенных проблем.

Общие действия по устранению неполадок

Категория Описание
Проблема Я использую Windows Server 2008, и функции Windows Touch не работают.
Причина Вы не включили возможности рабочего стола.
Решение Чтобы открыть средство администрирования "Диспетчер сервера": нажмите "Пуск", перейдите к "Администрирование", затем щелкните "Диспетчер сервера". Щелкните элемент "Компоненты" в левом столбце. Нажмите кнопку "Добавить компоненты" в разделе "Компоненты". Выберите "Рабочий стол с дополнительными функциями", нажмите «Далее», а затем нажмите кнопку «Установить».

 

Категория Описание
Проблема Всякий раз, когда я быстро перемещаю палец по моему приложению, появляется стрелка, и мой жест или манипуляция не регистрируются правильно.
Причина Включение жестов, когда это не требуется.
Решение Вы включили мелькание, когда вы хотите, чтобы она была отключена. Дополнительные сведения об отключении перьевых жестов смотрите в статье Поддержка совместимости с помощью полос прокрутки.

 

Проблема Я не могу различить входные данные мыши и входные данные Windows Touch.
Причина Windows создает сообщения мыши для поддержки устаревших систем, когда пользователь щелкает по экрану.
Решение Чтобы определить источник, можно вызвать GetMessageExtraInfo для WM_LBUTTONDOWN и WM_LBUTTONUP сообщений. В следующем коде показано, как это можно сделать.

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. }

 

Категория Описание
Проблема Как запустить приложения Microsoft PixelSense на Windows 7?
Причина Windows Touch и Microsoft PixelSense несовместимы.
Решение Вам нужно выбрать платформу Windows 7 или платформу Microsoft PixelSense.

 

Устранение неполадок с управлением и инерцией

Категория Описание
Проблема Мое приложение подвисает без видимой причины. При инициализации интерфейсов объектов я получаю нарушения доступа.
Причина Отсутствует вызов CoInitialize, когда используются интерфейсы IManipulationProcessor или IInertiaProcessor.
Решение Это может быть вызвано созданием экземпляров объектов модели компонентов Windows Touch (COM) без вызова CoInitialize. Иногда это происходит при преобразовании проектов из жестов в использование манипуляций или интерфейсов инерции.

 

Категория Описание
Проблема Мой объект поворачивается неправильно при переводе. Поворот одним пальцем не работает правильно.
Причина Неправильно установить пивоты на объекте.
Решение Вы не настраиваете точки сводных точек манипуляции правильно. Задайте свойства PivotPointX и PivotPointY в центр объекта или точки, вокруг которой нужно повернуть, и задайте для свойства PivotRadius радиус объекта.

 

Устранение неполадок с входным вводом Windows Touch

Категория Описание
Проблема После того как я обработаю сообщение WM_TOUCH , я перестаю получать отзывы о границах.
Причина Использование сообщения WM_TOUCH без обработки.
Решение Возможно, вы обрабатываете сообщение Windows Touch, не перенаправляя его в DefWindowProc, что может привести к неожиданному поведению. Дополнительные сведения о том, как правильно обрабатывать сообщения WM_TOUCH, см. в разделе «Начало работы с сообщениями Windows Touch».

 

Проблема Я подключаю windows.h, но он все еще сообщает, что WM_TOUCH не определен.
Причина Версия Windows в Targetver.h указана неправильно.
Решение Вы не установили правильную версию Windows в проекте. В следующем коде показан правильный набор версий Windows для Windows Touch в Windows 7.
C++
#ifndef WINVER                  // Specify that the minimum required platform is Windows 7.
#define WINVER 0x0601           
#endif

 

Проблема Мои сенсорные входные x-координаты и y-координаты, кажется, недопустимы. Они являются либо большими значениями, чем я ожидаю, либо они являются отрицательными значениями.
Причина Возможно, вам потребуется преобразовать точки касания в пиксели или преобразовать координаты экрана.
Решение Убедитесь, что вы вызываете TOUCH_COORD_TO_PIXEL и ScreenToClient. В следующем примере кода показано, как это сделать:
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_TOUCH и WM_GESTURE сообщения являются взаимоисключающими. Если вы не вызываете RegisterTouchWindow, вы получите только WM_GESTURE сообщения.

 

Категория Описание
Проблема Я замечаю небольшие задержки с момента касания пальцем экрана до получения отклика в моем приложении.
Причина Игнорирование касаний ладонью вызывает задержки ввода.
Решение Если TWF_WANTPALM установлен в вызовах RegisterTouchWindow, активируется функция отклонения ладони. Это приводит к небольшой задержке (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 необходимо вызвать 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 вместо сохранения пользовательских функций полосы прокрутки с использованием устаревшей поддержки. Вам необходимо поддерживать сообщения, как описано в разделе «Устаревшая поддержка панорамирования с помощью полос прокрутки».

 

Категория Описание
Проблема У меня происходят задержки с жестами.
Причина Флики могут вызывать задержки в распознавании жестов.
Решение Flicks может привести к задержкам в течение длительного времени для получения WM_GESTURE сообщений приложения. Сведения об отключении жестов см. в разделе "Устаревшая поддержка панорамирования с помощью полос прокрутки".

 

Руководство по программированию