Problembehandlung für Anwendungen

In diesem Abschnitt finden Sie Lösungen für häufig auftretende Probleme.

Allgemeine Problembehandlung

Category Beschreibung
Problem Ich verwende Windows Server 2008, und Windows Touch-Features funktionieren nicht.
Ursache Sie haben die Desktopumgebung nicht aktiviert.
Lösung Öffnen Sie das Server-Manager-Verwaltungstool: Klicken Sie auf Start, zeigen Sie auf Verwaltungstools, und klicken Sie dann auf Server-Manager. Klicken Sie in der linken Spalte auf das Element Features. Klicken Sie auf Features hinzufügen im Abschnitt Features. Wählen Sie Desktopumgebung, klicken Sie auf Weiter und dann auf Installieren.

 

Category Beschreibung
Problem Wenn ich meinen Finger schnell über meine Anwendung bewege, wird ein Pfeil angezeigt und meine Geste oder Manipulation wird nicht richtig registriert.
Ursache Sie haben „Streichen“ aktiviert, ohne dass dies erforderlich ist.
Lösung Sie sollten diese Funktion deaktivieren. Informationen zum Deaktivieren von Stiftstreichfunktionen finden Sie unter Legacy-Unterstützung für Panning mit Scrollbalken.

 

Problem Ich kann nicht zwischen Mauseingabe und Windows Touch-Eingabe unterscheiden.
Ursache Windows generiert Mausmeldungen für die Legacy-Unterstützung, wenn ein Benutzer auf den Bildschirm klickt.
Lösung Sie können GetMessageExtraInfo für die Meldungen WM_LBUTTONDOWN und WM_LBUTTONUP aufrufen, um die Quelle zu ermitteln. Der folgende Code zeigt eine mögliche Vorgehensweise.

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

 

Category Beschreibung
Problem Wie führe ich Microsoft PixelSense-Anwendungen unter Windows 7 aus?
Ursache Windows Touch und Microsoft PixelSense sind nicht kompatibel.
Lösung Sie müssen entweder auf die Windows 7-Plattform oder die Microsoft PixelSense-Plattform ausrichten.

 

Problembehandlung bei Manipulationen und Trägheit

Category Beschreibung
Problem Meine Anwendung hängt ohne ersichtlichen Grund fest. Ich erhalte Zugriffsverstöße, wenn ich meine Objektschnittstellen initialisiere.
Ursache Fehlender Aufruf von CoInitialize bei Verwendung der Schnittstellen IManipulationProcessor oder IInertiaProcessor .
Lösung Dies kann durch Instanziierung der COM-Objekte (Windows Touch Component Object Model) verursacht werden, ohne CoInitialize aufzurufen. Dies geschieht manchmal, wenn Sie Projekte von der Verwendung von Gesten zur Verwendung der Manipulationen oder Trägheit-Schnittstellen konvertieren.

 

Category Beschreibung
Problem Mein Objekt wird nicht ordnungsgemäß rotiert, wenn es übersetzt wird. Die Rotation mit einem Finger funktioniert nicht ordnungsgemäß.
Ursache Pivots für ein Objekt werden nicht ordnungsgemäß festgelegt.
Lösung Sie richten die Manipulations-Pivotpunkte nicht korrekt ein. Legen Sie die Eigenschaften PivotPointX und PivotPointY auf die Mitte des Objekts oder den beabsichtigten Drehpunkt fest, und setzen Sie die Eigenschaft PivotRadius auf den Radius Ihres Objekts.

 

Problembehandlung bei der Windows-Touch-Eingabe

Category Beschreibung
Problem Nachdem ich die WM_TOUCH-Nachricht behandelt habe, erhalte ich kein Begrenzungsfeedback mehr.
Ursache Verwenden der WM_TOUCH-Nachricht ohne Verarbeitung.
Lösung Sie verwenden wahrscheinlich eine Windows Touch-Nachricht, ohne sie an DefWindowProc weiterzuleiten, was zu unerwartetem Verhalten führt. Unter Erste Schritte mit Windows Touch Messages finden Sie weitere Informationen zum korrekten Umgang mit WM_TOUCH-Nachrichten.

 

Problem Ich beziehe windows.h ein, aber ich erhalte immer noch die Meldung, dass WM_TOUCH nicht definiert ist.
Ursache Die Windows-Version in Targetver.h ist inkorrekt.
Lösung Sie haben die nicht die korrekte Windows-Version in Ihrem Projekt festgelegt. Der folgende Code veranschaulicht die ordnungsgemäß festgelegten Windows-Versionen für Windows Touch in Windows 7.
C++
#ifndef WINVER                  // Specify that the minimum required platform is Windows 7.
#define WINVER 0x0601           
#endif

 

Problem Meine x- und y-Koordinaten für die Touch-Eingabe scheinen ungültig zu sein. Sie sind entweder größer als erwartet, oder es sind negative Werte.
Ursache Möglicherweise müssen Sie Ihre Touchpunkte in Pixel konvertieren, oder Sie müssen die Bildschirmkoordinaten konvertieren.
Lösung Rufen Sie unbedingt TOUCH_COORD_TO_PIXEL und ScreenToClient auf. Dies wird im folgenden Code veranschaulicht.
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;
          }
        }
      }

Hinweis:
Um die ScreenToClient-Funktion zu verwenden, müssen Sie in Ihrer Anwendung über Unterstützung für hohe DPI-Werte verfügen. Weitere Informationen zur Unterstützung hoher DPI-Werte finden Sie unter Hoher DPI-Wert.

 

 

Category Beschreibung
Problem Ich sehe keine WM_TOUCH-Nachrichten, weiß aber, das Windows Touch funktioniert, da ich WM_GESTURE-Nachrichten sehen.
Ursache Fehlender Aufruf von RegisterTouchWindow.
Lösung WM_TOUCH- und WM_GESTURE-Nachrichten schließen sich gegenseitig aus. Wenn Sie RegisterTouchWindow nicht aufrufen, erhalten Sie nur WM_GESTURE-Nachrichten.

 

Category Beschreibung
Problem Ich bemerke kleine Verzögerungen zwischen der Berührung mit meinem Finger und der Eingabe in meiner Anwendung.
Ursache Die Handflächenablehnung verursacht Verzögerungen bei der Eingabe.
Lösung Wenn TWF_WANTPALM in Aufrufen auf RegisterTouchWindow gesetzt ist, ist die Handflächenablehnung aktiviert. Dies führt zu einer kleinen Verzögerung (100 ms), während die Software testet, ob Eingaben von einem Finger, einem Stift oder der Handfläche des Benutzers stammen. Deaktivieren Sie die Handflächenablehnung durch den Aufruf von RegisterTouchWindow bei gelöschtem Flag TWF_WANTPALM.

 

Problembehandlung bei Windows-Touch-Gesten

Category Beschreibung
Problem Nach der Behandlung der WM_GESTURE-Nachricht bekomme ich kein Begrenzungsfeedback mehr. Oder eine Geste, die zuvor funktioniert hat, funktioniert jetzt nicht.
Ursache Verwenden der WM_GESTURE-Nachricht ohne Verarbeitung.
Lösung Sie verwenden wahrscheinlich eine Windows Touch-Nachricht, ohne sie an DefWindowProc weiterzuleiten, was zu unerwartetem Verhalten führt. Unter Erste Schritte mit Windows Gestures finden Sie weitere Informationen zum korrekten Umgang mit WM_GESTURE-Nachrichten.

 

Category Beschreibung
Problem Ich sehe keine WM_GESTURE-Nachrichten, weiß aber, das Windows Touch funktioniert, da ich WM_TOUCH-Nachrichten sehen.
Ursache Aufrufen von RegisterTouchWindow.
Lösung WM_TOUCH- und WM_GESTURE-Nachrichten schließen sich gegenseitig aus. Wenn Sie RegisterTouchWindow aufrufen, erhalten Sie keine WM_GESTURE-Nachrichten.

 

Problem Ich sehe nicht alle Gesten, die ich erwarte. Beispielsweise sehe ich Gesten mit der Kennung GID_PAN, aber nicht solche mit GID_ROTATE.
Ursache Einige Gesten, z. B. die Drehgeste, sind standardmäßig nicht aktiviert.
Lösung Sie müssen SetGestureConfig aufrufen, wenn Sie eine WM_GESTURENOTIFY-Nachricht erhalten, wie in der WM_GESTURENOTIFY-Referenz beschrieben, oder Sie müssen einen Handler für die WM_GESTURENOTIFY-Nachricht hinzufügen. Der folgende Code zeigt, wie ein Handler implementiert werden kann, um die Drehung zu unterstützen.

C++
// Die Nachrichten-Zuordnung. 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; // Die Gesten-Kennung. gc.dwWant = GC_ROTATE; // Der Gestenbefehl, den Sie für GID_ROTATE aktivieren. gc.dwBlock = 0; // Nichts blockieren. UINT uiGcs = 1; // Die Anzahl der einzustellenden Gesten.

BOOL bResult = SetGestureConfig(g_hMainWnd, 0, uiGcs, &gc, sizeof(GESTURECONFIG)); if(!bResult) { // Es ist ein Fehler aufgetreten, melden Sie den Fehler über Ihre bevorzugte Protokollierung. }

return 0; }

Weitere Beispiele für typische Gestenkonfigurationen finden Sie unter SetGestureConfig.

 

Category Beschreibung
Problem Die benutzerdefinierten Bildlaufleisten in meiner Anwendung führen keinen Bildlauf durch, wenn ich die Verschiebungsgeste ausführe.
Ursache Fehlende Handler für die korrekten WM_*SCROLL-Nachrichten.
Lösung Sie behandeln nicht alle WM_*SCROLL-Nachrichten in Ihren benutzerdefinierten Bildlaufleisten. Es wird empfohlen, die WM_GESTURE-Nachricht zu behandeln, anstatt benutzerdefinierte Bildlaufleistenfunktionen über die Legacy-Unterstützung beizubehalten. Sie müssen Nachrichten unterstützen, wie im Abschnitt Legacy-Unterstützung für Verschiebungen mit Bildlaufleisten beschrieben.

 

Category Beschreibung
Problem Ich erhalte Verzögerungen bei Gesten.
Ursache Streichen verursacht möglicherweise Verzögerungen bei Gesten.
Lösung Streichen kann zu Verzögerungen dabei führen, wie lange es dauert, bis Ihre Anwendung WM_GESTURE-Nachrichten empfängt. Siehe Legacy-Unterstützung für Panning mit Scrollbalken für Information zur Deaktivierung von Streichfunktionen.

 

Programmierhandbuch