Condividi tramite


Risoluzione dei problemi relativi alle applicazioni

In questa sezione vengono fornite soluzioni ai problemi comuni.

Risoluzione di problemi generali

Categoria Descrizione
Problema Le funzionalità Windows Server 2008 e Windows Touch non funzionano.
Causa L'esperienza desktop non è stata abilitata.
Soluzione Aprire lo strumento di amministrazione di Server Manager: fare clic su Start, scegliere Strumenti di amministrazione e quindi fare clic su Server Manager. Fare clic sull'elemento Features (Funzionalità) nella colonna sinistra. Fare clic su Aggiungi funzionalità nella sezione Funzionalità . Selezionare Esperienza desktop, fare clic su Avanti e quindi su Installa.

 

Categoria Descrizione
Problema Ogni volta che si sposta il dito rapidamente attraverso l'applicazione, viene visualizzata una freccia e il movimento o la manipolazione non viene registrata correttamente.
Causa Dopo aver abilitato i scorrere quando non è necessario.
Soluzione È stato abilitato un tocco quando si vuole che venga disabilitato. Per informazioni sulla disabilitazione dei tasti di scorrimento, vedere Supporto legacy per la panoramica con le barre di scorrimento.

 

Problema Non riesco a distinguere tra l'input del mouse e l'input tocco di Windows.
Causa Windows genera messaggi del mouse per il supporto legacy quando un utente fa clic sullo schermo.
Soluzione È possibile chiamare GetMessageExtraInfo per i messaggi WM_LBUTTONDOWN e WM_LBUTTONUP per determinare l'origine. Nel codice seguente viene illustrato come eseguire questa operazione.

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

 

Categoria Descrizione
Problema Ricerca per categorie eseguire applicazioni Microsoft PixelSense in Windows 7?
Causa Windows Touch e Microsoft PixelSense non sono compatibili.
Soluzione Devi scegliere come destinazione la piattaforma Windows 7 o microsoft PixelSense.

 

Risoluzione dei problemi relativi a manipolazioni e inerzia

Categoria Descrizione
Problema La mia applicazione non si blocca per nessun motivo. Si ricevono violazioni di accesso quando si inizializzano le interfacce dell'oggetto.
Causa Manca una chiamata a CoInitialize quando si usano le interfacce IManipulationProcessor o IInertiaProcessor.
Soluzione Ciò potrebbe essere causato dalla creazione di un'istanza degli oggetti COM (Windows Touch Component Object Model) senza chiamare CoInitialize. Ciò si verifica a volte quando si convertono progetti dall'uso dei movimenti all'uso delle manipolazioni o delle interfacce di inerzia.

 

Categoria Descrizione
Problema Il mio oggetto ruota in modo errato quando viene tradotto. La rotazione con un solo dito non funziona correttamente.
Causa Impostazione non corretta dei pivot su un oggetto .
Soluzione Non si configurano correttamente i punti pivot di manipolazione. Impostare le proprietà PivotPointX e PivotPointY sul centro dell'oggetto o del punto da ruotare e impostare la proprietà PivotRadius sul raggio dell'oggetto.

 

Risoluzione dei problemi relativi all'input tocco di Windows

Categoria Descrizione
Problema Dopo aver gestito il messaggio di WM_TOUCH , smetti di ricevere feedback sui limiti.
Causa Utilizzo del messaggio di WM_TOUCH senza gestirlo.
Soluzione È probabile che si stia utilizzando un messaggio tocco di Windows senza inoltrarlo a DefWindowProc, che comporterà un comportamento imprevisto. Per altre informazioni su come gestire correttamente i messaggi di WM_TOUCH, vedere Introduzione ai messaggi tocco di Windows.

 

Problema Sono incluso windows.h, ma dice ancora che WM_TOUCH non è definito.
Causa La versione di Windows in Targetver.h non è corretta.
Soluzione Non è stata impostata la versione corretta di Windows nel progetto. Il codice seguente illustra le versioni di Windows impostate correttamente per Windows Touch in Windows 7.
C++
#ifndef WINVER                  // Specify that the minimum required platform is Windows 7.
#define WINVER 0x0601           
#endif

 

Problema Le coordinate x e le coordinate y dell'input tocco sembrano non valide. Sono valori più grandi di quelli previsti o sono valori negativi.
Causa Potrebbe essere necessario convertire i punti di tocco in pixel oppure potrebbe essere necessario convertire le coordinate dello schermo.
Soluzione Assicurarsi di chiamare TOUCH_COORD_TO_PIXEL e ScreenToClient. A tal fine, osservare il codice indicato di seguito.
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;
          }
        }
      }

Nota:
Per usare la funzione ScreenToClient , è necessario disporre del supporto DPI elevato nell'applicazione. Per altre informazioni sul supporto di valori DPI elevati, vedere DPI elevato.

 

 

Categoria Descrizione
Problema Non vedo messaggi WM_TOUCH, ma so che Windows Touch funziona perché vedo WM_GESTURE messaggi.
Causa Manca una chiamata a RegisterTouchWindow.
Soluzione WM_TOUCH e WM_GESTURE messaggi si escludono a vicenda. Se non chiami RegisterTouchWindow, riceverai solo WM_GESTURE messaggi.

 

Categoria Descrizione
Problema Sto notando piccoli ritardi dal momento in cui tocco il dito verso il basso quando ricevo l'input nella mia applicazione.
Causa Il rifiuto del palmo sta causando ritardi nell'input.
Soluzione Se TWF_WANTPALM è impostato nelle chiamate a RegisterTouchWindow, il rifiuto del palmo è abilitato. Ciò causa un piccolo ritardo (100 ms) mentre il software verifica se l'input proviene da un dito, una penna o il palmo dell'utente. Disabilitare il rifiuto del palmo chiamando RegisterTouchWindow con il flag TWF_WANTPALM deselezionato.

 

Risoluzione dei problemi relativi ai movimenti tocco di Windows

Categoria Descrizione
Problema Dopo aver gestito il messaggio di WM_GESTURE , smetti di ricevere feedback sui limiti. In alternativa, un gesto che funzionava in precedenza non funziona ora.
Causa Utilizzo del messaggio di WM_GESTURE senza gestirlo.
Soluzione È probabile che si stia utilizzando un messaggio tocco di Windows senza inoltrarlo a DefWindowProc, che comporterà un comportamento imprevisto. Per altre informazioni su come gestire correttamente i messaggi WM_GESTURE, vedere Introduzione ai movimenti di Windows.

 

Categoria Descrizione
Problema Non vedo messaggi WM_GESTURE, ma so che Windows Touch funziona perché vedo WM_TOUCH messaggi.
Causa Chiamata a RegisterTouchWindow.
Soluzione WM_TOUCH e WM_GESTURE messaggi si escludono a vicenda. Se chiami RegisterTouchWindow, non riceverai WM_GESTURE messaggi.

 

Problema Non vedo tutti i gesti che mi aspetto di vedere. Ad esempio, visualizzo i movimenti con l'identificatore GID_PAN ma non GID_ROTATE.
Causa Alcuni movimenti, ad esempio il movimento di rotazione, non sono abilitati per impostazione predefinita.
Soluzione È necessario chiamare SetGestureConfig quando si riceve un messaggio di WM_GESTURENOTIFY come descritto nel riferimento WM_GESTURENOTIFY oppure è necessario aggiungere un gestore per il messaggio WM_GESTURENOTIFY. Il codice seguente illustra come implementare un gestore per abilitare il supporto per la rotazione.

C++
Mappa dei messaggi. 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; // Identificatore del movimento. gc.dwWant = GC_ROTATE; Comando di movimento che si abilita per GID_ROTATE. gc.dwBlock = 0; Non bloccare nulla. UINT uiGcs = 1; Numero di movimenti impostati.

BOOL bResult = SetGestureConfig(g_hMainWnd, 0, uiGcs, &gc, sizeof(GESTURECONFIG)); if(!bResult) { // Si è verificato un errore, segnalare l'errore usando la registrazione preferita. }

return 0; }

Per altri esempi di configurazioni tipiche dei movimenti, vedere SetGestureConfig.

 

Categoria Descrizione
Problema Le barre di scorrimento personalizzate nell'applicazione non vengono scorrete quando si esegue il movimento di panoramica.
Causa Gestori mancanti per i messaggi di WM_*SCROLL corretti.
Soluzione Non si gestiscono tutti i messaggi WM_*SCROLL nelle barre di scorrimento personalizzate. È consigliabile gestire il messaggio WM_GESTURE anziché mantenere la funzionalità personalizzata della barra di scorrimento tramite il supporto legacy. È necessario supportare i messaggi come descritto nella sezione Supporto legacy per la panoramica con barre di scorrimento.

 

Categoria Descrizione
Problema Sto ricevendo ritardi per i movimenti.
Causa I movimenti possono causare ritardi nei movimenti.
Soluzione Le operazioni Flick possono causare ritardi per quanto tempo l'applicazione deve ricevere WM_GESTURE messaggi. Vedere Supporto legacy per la panoramica con barre di scorrimento per informazioni sulla disabilitazione dei scorrere.

 

Guida per programmatori