Condividi tramite


Introduzione ai messaggi tocco di Windows

Questa sezione illustra le attività associate al recupero dell'input tocco di Windows per funzionare nell'applicazione.

I passaggi seguenti vengono in genere eseguiti quando si lavora con i messaggi tocco di Windows:

  1. Testare le funzionalità del digitalizzatore di input.
  2. Registrarsi per ricevere messaggi di Windows Touch.
  3. Gestire i messaggi.

Il messaggio usato per Windows Touch è WM_TOUCH. Questo messaggio indica i vari stati di contatto con un digitalizzatore.

Test delle funzionalità del digitalizzatore di input

La funzione GetSystemMetrics può essere usata per eseguire query sulle funzionalità del digitalizzatore di input passando il valore nIndex di SM_DIGITIZER. GetSystemMetrics restituisce un campo bit che indica se il dispositivo è pronto, se il dispositivo supporta la penna o il tocco, se il dispositivo di input è integrato o esterno e se il dispositivo supporta più input (Windows Touch). Nella tabella seguente vengono illustrati i bit per i vari campi.

Bit 8 7 6 5 4 3 2 1
Valore Stack Ready Input multipli Prenotato Prenotato Penna esterna Penna integrata Tocco esterno Touch integrato

 

Per testare il risultato del comando per una particolare funzionalità, è possibile usare l'operatore bit per bit e il bit specifico che si sta testando. Ad esempio, per testare Windows Touch, è necessario verificare che il bit di settimo ordine sia impostato (0x40 in esadecimale). Nell'esempio di codice seguente viene illustrato come testare questi valori.

#include <windows.h>
// test for touch
int value = GetSystemMetrics(SM_DIGITIZER);
if (value & NID_READY){ /* stack ready */}
if (value  & NID_MULTI_INPUT){
    /* digitizer is multitouch */ 
    MessageBoxW(hWnd, L"Multitouch found", L"IsMulti!", MB_OK);
}
if (value & NID_INTEGRATED_TOUCH){ /* Integrated touch */}

Nella tabella seguente sono elencate le costanti definite in windows.h per il test delle funzionalità di tocco del digitalizzatore di input.

Nome valore Descrizione
TABLET_CONFIG_NONE 0x00000000 Il digitalizzatore di input non dispone di funzionalità di tocco.
NID_INTEGRATED_TOUCH 0x00000001 Un digitalizzatore touch integrato viene usato per l'input.
NID_EXTERNAL_TOUCH 0x00000002 Per l'input viene usato un digitalizzatore tocco esterno.
NID_INTEGRATED_PEN 0x00000004 Per l'input viene usato un digitalizzatore penna integrato.
NID_EXTERNAL_PEN 0x00000008 Per l'input viene usato un digitalizzatore penna esterno.
NID_MULTI_INPUT 0x00000040 Per l'input viene usato un digitalizzatore di input con supporto per più input.
NID_READY 0x00000080 Il digitalizzatore di input è pronto per l'input. Se questo valore non è impostato, potrebbe significare che il servizio tablet è arrestato, il digitalizzatore non è supportato o i driver del digitalizzatore non sono stati installati.

 

Controllare i valori NID_* è un modo utile per controllare le funzionalità del computer di un utente per configurare l'applicazione per l'input tocco, penna o non tablet. Ad esempio, se si dispone di un'interfaccia utente dinamica e si vuole configurare automaticamente alcuni di esso, è possibile verificare la presenza di NID_INTEGRATED_TOUCH, NID_MULTITOUCH e ottenere il numero massimo di ritocchi la prima volta che un utente esegue l'applicazione.

Nota

Esistono alcune limitazioni intrinseche per SM_GETSYSTEMMETRICS. Ad esempio, non esiste alcun supporto per plug and play. Per questo motivo, prestare attenzione quando si usa questa funzione come mezzo per la configurazione permanente.

 

Registrazione per ricevere l'input tocco di Windows

Prima di ricevere l'input Windows Touch, le applicazioni devono prima registrarsi per ricevere l'input di Windows Touch. Registrando la finestra dell'applicazione, l'applicazione indica che è compatibile con il tocco. Dopo che l'applicazione ha registrato la finestra, le notifiche del driver Windows Touch vengono inoltrate all'applicazione quando viene effettuato l'input nella finestra. Quando l'applicazione viene arrestata, annulla la registrazione della finestra per disabilitare le notifiche.

Nota

WM_TOUCH messaggi sono attualmente "greedy". Dopo la ricezione del primo messaggio di tocco in una finestra, tutti i messaggi di tocco vengono inviati a tale finestra finché un'altra finestra non riceve lo stato attivo.

 

Nota

Per impostazione predefinita, si ricevono messaggi WM_GESTURE anziché WM_TOUCH messaggi. Se chiami RegisterTouchWindow, smetterai di ricevere WM_GESTURE messaggi.

 

Il codice seguente illustra come un'applicazione può registrarsi per ricevere messaggi Di Windows Touch in un'applicazione Win32.

RegisterTouchWindow(hWnd, 0);

Gestione dei messaggi tocco di Windows

Puoi gestire i messaggi di Windows Touch dalle applicazioni nei sistemi operativi Windows in molti modi. Se si programma un'applicazione GUI, aggiungere codice all'interno della WndProc funzione per gestire i messaggi di interesse. Se si programma un'applicazione MFC (Microsoft Foundation Class) o un'applicazione gestita, si aggiungono gestori per i messaggi di interesse. L'esempio di codice seguente illustra come gestire i messaggi di tocco da WndProc in un'applicazione basata su Windows.

  LRESULT OnTouch(HWND hWnd, WPARAM wParam, LPARAM lParam ){
    BOOL bHandled = FALSE;
    UINT cInputs = LOWORD(wParam);
    PTOUCHINPUT pInputs = new TOUCHINPUT[cInputs];
    if (pInputs){
        if (GetTouchInputInfo((HTOUCHINPUT)lParam, cInputs, pInputs, sizeof(TOUCHINPUT))){
            for (UINT i=0; i < cInputs; i++){
                TOUCHINPUT ti = pInputs[i];
                //do something with each touch input entry
            }            
            bHandled = TRUE;
        }else{
             /* handle the error here */
        }
        delete [] pInputs;
    }else{
        /* handle the error here, probably out of memory */
    }
    if (bHandled){
        // if you handled the message, close the touch input handle and return
        CloseTouchInputHandle((HTOUCHINPUT)lParam);
        return 0;
    }else{
        // if you didn't handle the message, let DefWindowProc handle it
        return DefWindowProc(hWnd, WM_TOUCH, wParam, lParam);
    }
  }


LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    int wmId, wmEvent;
    PAINTSTRUCT ps;
    HDC hdc;

    switch (message)
    {
      // pass touch messages to the touch handler 
      case WM_TOUCH:
        OnTouch(hWnd, wParam, lParam);
        break;

Il codice seguente illustra come implementare la mappa messaggi e un gestore di messaggi. Si noti che i messaggi devono essere dichiarati nella mappa dei messaggi e quindi deve essere implementato il gestore per il messaggio. Ad esempio, in un'applicazione MFC, questo può essere dichiarato nel codice della finestra di dialogo. Si noti anche che la funzione per la OnInitDialog finestra di dialogo deve includere una chiamata a RegisterTouchWindow , RegisterTouchWindow(m_hWnd, 0)ad esempio .

  // Class implementations within a dialog
  LRESULT TestDlg::OnTouch( WPARAM wParam, LPARAM lParam ){
    //Insert handler code here to do something with the message or uncomment the following line to test
    //MessageBox(L"touch!", L"touch!", MB_OK);
    return 0;
  }
  // The message map
  BEGIN_MESSAGE_MAP()
    ON_WM_CREATE()
    ... ... ...
    ON_MESSAGE(WM_TOUCH, OnTouch)
  END_MESSAGE_MAP()  
 
  BOOL TestDlg::OnInitDialog()
  {
    CDialog::OnInitDialog();    

    RegisterTouchWindow(m_hWnd, 0);
     ... ... ...
  }  
  

Il tocco della finestra indicherà i tocchi da una finestra popup.

Input tocco di Windows