Erste Schritte mit Windows-Touchnachrichten

In diesem Abschnitt werden die Aufgaben erläutert, die mit dem Abrufen der Windows-Toucheingabe in Ihrer Anwendung verknüpft sind.

Die folgenden Schritte werden in der Regel ausgeführt, wenn Sie mit Windows Touch-Nachrichten arbeiten:

  1. Testen Sie die Funktionen des Eingabedigisierers.
  2. Registrieren Sie sich, um Windows Touch-Nachrichten zu empfangen.
  3. Behandeln sie die Nachrichten.

Die für Windows Touch verwendete Nachricht ist WM_TOUCH. Diese Meldung gibt die verschiedenen Kontaktzustände mit einem Digitizer an.

Testen der Funktionen des Eingabedigisierers

Die GetSystemMetrics-Funktion kann verwendet werden, um die Funktionen des Eingabedigisierers abzufragen, indem der nIndex-Wert von SM_DIGITIZER übergeben wird. GetSystemMetrics gibt ein Bitfeld zurück, das angibt, ob das Gerät bereit ist, ob das Gerät Stift oder Touch unterstützt, ob das Eingabegerät integriert oder extern ist und ob das Gerät mehrere Eingaben unterstützt (Windows Touch). Die folgende Tabelle zeigt die Bits für die verschiedenen Felder.

bit 8 7 6 5 4 3 2 1
Wert Stapelbereit Mehrere Eingaben Reserviert Reserviert Externer Stift Integrierter Stift Externer Touch Integrierte Toucheingabe

 

Um das Ergebnis des Befehls für ein bestimmtes Feature zu testen, können Sie den bitweisen & Operator und das bestimmte Bit verwenden, das Sie testen. Um beispielsweise für Windows Touch zu testen, würden Sie testen, dass das Bit der siebten Ordnung festgelegt ist (0x40 im Hex). Das folgende Codebeispiel zeigt, wie diese Werte getestet werden können.

#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 */}

In der folgenden Tabelle sind die konstanten aufgeführt, die in windows.h zum Testen der Touchfunktionen des Eingabedigisierers definiert sind.

Name Wert Beschreibung
TABLET_CONFIG_NONE 0x00000000 Der Eingabedigisierer verfügt nicht über Touchfunktionen.
NID_INTEGRATED_TOUCH 0x00000001 Für die Eingabe wird ein integrierter Touch-Digitizer verwendet.
NID_EXTERNAL_TOUCH 0x00000002 Für die Eingabe wird ein externer Touchdigisierer verwendet.
NID_INTEGRATED_PEN 0x00000004 Für die Eingabe wird ein integrierter Stiftdigisierer verwendet.
NID_EXTERNAL_PEN 0x00000008 Für die Eingabe wird ein externer Stiftdigisierer verwendet.
NID_MULTI_INPUT 0x00000040 Für die Eingabe wird ein Eingabedigisierer mit Unterstützung für mehrere Eingaben verwendet.
NID_READY 0x00000080 Der Eingabedigisierer ist eingabebereit. Wenn dieser Wert nicht festgelegt ist, kann dies bedeuten, dass der Tablet-Dienst beendet, der Digitizer nicht unterstützt wird oder Dass Digitizer-Treiber nicht installiert wurden.

 

Das Überprüfen der NID_*-Werte ist eine nützliche Möglichkeit, die Funktionen des Computers eines Benutzers zu überprüfen, um Ihre Anwendung für Toucheingaben, Stifteingaben oder Nicht-Tablet-Eingaben zu konfigurieren. Wenn Sie beispielsweise über eine dynamische Benutzeroberfläche (UI) verfügen und einen Teil davon automatisch konfigurieren möchten, können Sie nach NID_INTEGRATED_TOUCH, NID_MULTITOUCH suchen und die maximale Anzahl von Berührungen erhalten, wenn ein Benutzer Ihre Anwendung zum ersten Mal ausführt.

Hinweis

Es gibt einige inhärente Einschränkungen für SM_GETSYSTEMMETRICS. Beispielsweise gibt es keine Unterstützung für Plug-and-Play. Aus diesem Grund sind Sie vorsichtig, wenn Sie diese Funktion als Mittel für die dauerhafte Konfiguration verwenden.

 

Registrieren zum Empfangen von Windows-Toucheingaben

Vor dem Empfang von Windows Touch-Eingaben müssen sich Anwendungen zuerst registrieren, um Windows Touch-Eingaben zu empfangen. Durch die Registrierung des Anwendungsfensters gibt die Anwendung an, dass es touchkompatibel ist. Nachdem die Anwendung ihr Fenster registriert hat, werden Benachrichtigungen vom Windows Touch-Treiber an die Anwendung weitergeleitet, wenn die Eingabe im Fenster erfolgt. Wenn die Anwendung heruntergefahren wird, hebt sie die Registrierung des Fensters auf, um Benachrichtigungen zu deaktivieren.

Hinweis

WM_TOUCH Nachrichten sind derzeit "gierig". Nachdem die erste Touchnachricht in einem Fenster empfangen wurde, werden alle Touchnachrichten an dieses Fenster gesendet, bis ein anderes Fenster den Fokus erhält.

 

Hinweis

Standardmäßig erhalten Sie WM_GESTURE Nachrichten anstelle von WM_TOUCH Nachrichten. Wenn Sie RegisterTouchWindow aufrufen, erhalten Sie nicht mehr WM_GESTURE Nachrichten.

 

Der folgende Code veranschaulicht, wie sich eine Anwendung registrieren kann, um Windows Touch-Nachrichten in einer Win32-Anwendung zu empfangen.

RegisterTouchWindow(hWnd, 0);

Behandeln von Windows-Touchnachrichten

Sie können windows Touch-Nachrichten von Anwendungen in Windows-Betriebssystemen auf vielfältige Weise verarbeiten. Wenn Sie eine GUI-Anwendung programmieren, fügen Sie der Funktion Code WndProc hinzu, um die Meldungen von Interesse zu verarbeiten. Wenn Sie eine Microsoft Foundation Class (MFC) oder eine verwaltete Anwendung programmieren, fügen Sie Handler für die relevanten Nachrichten hinzu. Das folgende Codebeispiel zeigt, wie Touchnachrichten von WndProc in einer Windows-basierten Anwendung verarbeitet werden können.

  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;

Der folgende Code zeigt, wie Sie die Nachrichtenzuordnung und einen Nachrichtenhandler implementieren können. Beachten Sie, dass die Nachrichten in der Nachrichtenzuordnung deklariert werden müssen und dann der Handler für die Nachricht implementiert werden sollte. In einer MFC-Anwendung kann dies beispielsweise im Dialogcode deklariert werden. Beachten Sie auch, dass die OnInitDialog Funktion für Ihr Dialogfeld einen Aufruf von RegisterTouchWindowRegisterTouchWindow(m_hWnd, 0)wie enthalten müsste.

  // 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);
     ... ... ...
  }  
  

Wenn Sie das Fenster berühren, werden Toucheingaben aus einem Popupfenster angezeigt.

Windows-Toucheingabe