Udostępnij przez


Rozwiązywanie problemów z aplikacjami

Ta sekcja zawiera rozwiązania typowych problemów.

Ogólne rozwiązywanie problemów

Kategoria Opis
Kwestia Mam uruchomiony Windows Server 2008, a funkcje Windows Touch nie działają.
Przyczyna Nie włączyłeś doświadczenia pulpitu.
Rozwiązanie Otwórz narzędzie administracyjne Menedżera serwera: kliknij przycisk Uruchom, wskaż Narzędzia administracyjne, a następnie kliknij pozycję Menedżer serwera . Kliknij element funkcje w lewej kolumnie. Kliknij Dodaj funkcje w sekcji Funkcje. Wybierz pozycję Środowisko pulpitu, kliknij przycisk Dalej, a następnie kliknij przycisk Zainstaluj.

 

Kategoria Opis
Problem Za każdym razem, gdy szybko przesuwam palcem przez moją aplikację, pojawia się strzałka, a mój gest lub manipulacja nie rejestruje się poprawnie.
Przyczyna Włączając funkcję flicks, gdy nie jest to potrzebne.
Rozwiązanie Masz włączone migacze, gdy chcesz go wyłączyć. Aby uzyskać informacje na temat wyłączania migawek pióra, zobacz Starsza obsługa przesuwania z paskami przewijania.

 

Zagadnienie Nie mogę odróżnić danych wejściowych myszy i danych wejściowych Windows Touch.
Przyczyna System Windows generuje komunikaty związane z myszką dla kompatybilności ze starszymi systemami, gdy użytkownik kliknie ekran.
Rozwiązanie Aby określić źródło, możesz wywołać GetMessageExtraInfo dla komunikatów WM_LBUTTONDOWN i WM_LBUTTONUP. Poniższy kod pokazuje, jak można to zrobić.

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

 

Kategoria Opis
Problem Jak uruchamiać aplikacje Microsoft PixelSense w systemie Windows 7?
Przyczyna Funkcje Windows Touch i Microsoft PixelSense są niezgodne.
Rozwiązanie Musisz wybrać platformę Windows 7 lub platformę Microsoft PixelSense.

 

Rozwiązywanie problemów z manipulowaniem i inercjami

Kategoria Opis
Kwestia Moja aplikacja zawiesza się bez powodu. Otrzymuję naruszenia dostępu podczas inicjowania interfejsów obiektów.
Przyczyna Brak wywołania CoInitialize w przypadku korzystania z interfejsu IManipulationProcessor lub IInertiaProcessor.
Rozwiązanie Może to być spowodowane instancjowaniem obiektów Windows Touch Modelu Obiektów COM bez wywołania CoInitialize. Dzieje się tak czasami, gdy konwertujesz projekty z używania gestów do używania manipulacji lub interfejsów inercji.

 

Kategoria Opis
Problem Mój obiekt obraca się nieprawidłowo, gdy jest tłumaczony. Obrót jednym palcem nie działa poprawnie.
Przyczyna Niepoprawne ustawianie punktów obrotu na obiekcie.
Rozwiązanie Nie konfigurujesz poprawnie punktów obrotu manipulacji. Ustaw właściwości PivotPointX i PivotPointY na środek obiektu lub punktu, wokół którego chcesz obracać, i ustaw właściwość PivotRadius na promień obiektu.

 

Rozwiązywanie problemów z dotykowym wprowadzaniem danych w systemie Windows

Kategoria Opis
Problem Po obsłużeniu komunikatu WM_TOUCH przestaję otrzymywać informację zwrotną dotyczącą granic.
Przyczyna Korzystanie z komunikatu WM_TOUCH bez jego obsługiwania.
Rozwiązanie Prawdopodobnie korzystasz z komunikatu Windows Touch bez przekazywania go do DefWindowProc, co spowoduje nieoczekiwane zachowanie. Aby uzyskać więcej informacji na temat prawidłowego obsługi komunikatów WM_TOUCH, zobacz Wprowadzenie do komunikatów dotykowych systemu Windows.

 

Problem Dołączam windows.h, ale nadal informuje, że WM_TOUCH nie jest zdefiniowany.
Przyczyna Wersja systemu Windows w pliku Targetver.h jest niepoprawna.
Rozwiązanie Nie ustawiono poprawnej wersji systemu Windows w projekcie. Poniższy kod ilustruje prawidłowo ustawione wersje systemu Windows dla windows Touch w systemie Windows 7.
C++
#ifndef WINVER                  // Specify that the minimum required platform is Windows 7.
#define WINVER 0x0601           
#endif

 

Problem Moje współrzędne x i y dla dotyku wydają się być nieprawidłowe. Są to wartości większe niż oczekiwano lub są wartościami ujemnymi.
Przyczyna Może być konieczne przekonwertowanie punktów dotykowych na piksele lub może być konieczne przekonwertowanie współrzędnych ekranu.
Rozwiązanie Upewnij się, że wywołujesz TOUCH_COORD_TO_PIXEL i ScreenToClient. Poniższy kod pokazuje, jak to zrobić.
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;
          }
        }
      }

Uwaga:
Aby użyć funkcji ScreenToClient, aplikacja musi obsługiwać wysoką rozdzielczość DPI. Aby uzyskać więcej informacji na temat obsługi wysokiej rozdzielczości DPI, zobacz high DPI.

 

 

Kategoria Opis
Problem Nie widzę WM_TOUCH wiadomości, ale wiem, że funkcja Windows Touch działa, ponieważ widzę WM_GESTURE wiadomości.
Przyczyna Brak wywołania RegisterTouchWindow.
Rozwiązanie WM_TOUCH i WM_GESTURE wiadomości wzajemnie się wykluczają. Jeśli nie wywołasz RegisterTouchWindow, otrzymasz tylko wiadomość WM_GESTURE.

 

Kategoria Opis
Kwestia Zauważam małe opóźnienia od czasu dotknięcia palca w dół do kiedy otrzymuję dane wejściowe w mojej aplikacji.
Przyczyna Odrzucenie dłoni powoduje opóźnienia wprowadzania danych.
Rozwiązanie Jeśli TWF_WANTPALM jest ustawione w wywołaniach RegisterTouchWindow, funkcja odrzucania dotyku dłoni jest włączona. Powoduje to małe (100 ms) opóźnienie, podczas gdy oprogramowanie sprawdza, czy dane wejściowe pochodzą z palca, pióra lub dłoni użytkownika. Aby wyłączyć funkcję odrzucania dłoni, wywołaj RegisterTouchWindow z wyłączoną flagą TWF_WANTPALM.

 

Rozwiązywanie problemów z gestami dotykowymi w systemie Windows

Kategoria Opis
Problem Po obsłudze komunikatu WM_GESTURE przestaję otrzymywać informacje zwrotne o granicach. Lub gest, który pracował wcześniej, nie działa teraz.
Przyczyna Pobieranie komunikatu WM_GESTURE bez jego obsługi.
Rozwiązanie Prawdopodobnie korzystasz z komunikatu Windows Touch bez przekazywania go do DefWindowProc, co spowoduje nieoczekiwane zachowanie. Sprawdź Wprowadzenie do gestów systemu Windows, aby uzyskać więcej informacji na temat prawidłowego obsługi komunikatów WM_GESTURE.

 

Kategoria Opis
Problem Nie widzę WM_GESTURE wiadomości, ale wiem, że funkcja Windows Touch działa, ponieważ widzę WM_TOUCH wiadomości.
Przyczyna Wywołanie funkcji RegisterTouchWindow.
Rozwiązanie WM_TOUCH i WM_GESTURE wiadomości wzajemnie się wykluczają. Jeśli wywołasz RegisterTouchWindow, nie otrzymasz komunikatów WM_GESTURE.

 

Problem Nie widzę wszystkich gestów, których spodziewam się zobaczyć. Na przykład widzę gesty z identyfikatorem GID_PAN, ale nie GID_ROTATE.
Przyczyna Niektóre gesty, takie jak gest obracania, nie są domyślnie włączone.
Rozwiązanie Należy wywołać SetGestureConfig po otrzymaniu komunikatu WM_GESTURENOTIFY zgodnie z opisem w dokumentacji WM_GESTURENOTIFY lub dodać procedurę obsługiwania dla komunikatu WM_GESTURENOTIFY. Poniższy kod pokazuje, jak można zaimplementować procedurę obsługi w celu umożliwienia obsługi rotacji.

C++
              
              // Mapa komunikatów. 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; // Identyfikator gestu. gc.dwWant = GC_ROTATE; Polecenie gestu, które włączasz dla GID_ROTATE. gc.dwBlock = 0; Nie blokuj niczego. UINT uiGcs = 1; Liczba ustawianych gestów.

BOOL bResult = SetGestureConfig(g_hMainWnd, 0, uiGcs, &gc, sizeof(GESTURECONFIG)); if(!bResult) { // Wystąpił problem, zgłoś błąd przy użyciu preferowanego rejestrowania. }

return 0; }

Aby uzyskać więcej przykładów typowych konfiguracji gestów, zobacz SetGestureConfig.

 

Kategoria Opis
Problem Niestandardowe paski przewijania w mojej aplikacji nie przewijają się podczas wykonywania gestu przesuwania.
Przyczyna Brak procedur obsługi dla poprawnych komunikatów WM_*SCROLL.
Rozwiązanie Nie obsługujesz wszystkich komunikatów WM_*SCROLL w dostosowanych paskach przewijania. Zaleca się obsługę komunikatu WM_GESTURE zamiast zachowywać niestandardowe funkcje paska przewijania za pośrednictwem starszej obsługi. Musisz obsługiwać wiadomości zgodnie z opisem w sekcji dotyczącym starszej obsługi przesuwania z paskami przewijania.

 

Kategoria Opis
Zagadnienie Doświadczam opóźnień przy gestach.
Przyczyna Flicks może powodować opóźnienia gestów.
Rozwiązanie Migacze mogą powodować opóźnienia czasu odbierania komunikatów WM_GESTURE przez aplikację. Aby uzyskać informacje na temat wyłączania gestów machnięcia, zobacz Obsługa dziedziczna przesuwania z paskami przewijania.

 

Przewodnik programowania