共用方式為


開始使用 Windows Touch 訊息

本節說明與在應用程式中取得 Windows Touch 輸入以運作相關的工作。

使用 Windows Touch 訊息時,通常會執行下列步驟:

  1. 測試輸入數位板的功能。
  2. 註冊以接收 Windows Touch 訊息。
  3. 處理訊息。

用於 Windows Touch 的訊息WM_TOUCH。 此訊息表示與數位板接觸的各種狀態。

測試輸入數位板的功能

GetSystemMetrics 函式可用來藉由傳入 nIndexSM_DIGITIZER來查詢輸入數位板的功能。 GetSystemMetrics 會傳回位欄位欄位,指出裝置是否已就緒、裝置是否支援手寫筆或觸控、輸入裝置是否整合或外部,以及裝置是否支援多個輸入(Windows Touch)。 下表顯示各種欄位的位。

位元 8 7 6 5 4 3 2 1
堆疊就緒 多重輸入 已保留 已保留 外部畫筆 整合式手寫筆 外部觸控 整合式觸控

 

若要針對特定功能測試命令的結果,您可以使用位和運算符,以及您要測試的特定位。 例如,若要測試 Windows Touch,您會測試是否已設定第七個順序位(0x40十六進位)。 下列程式代碼範例示範如何測試這些值。

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

下表列出 windows.h 中定義的常數,以測試輸入數位板的觸控功能。

名稱 數值 Description
TABLET_CONFIG_NONE 0x00000000 輸入數位板沒有觸控功能。
NID_INTEGRATED_TOUCH 0x00000001 整合式觸控數位板用於輸入。
NID_EXTERNAL_TOUCH 0x00000002 外部觸控數位板用於輸入。
NID_INTEGRATED_PEN 0x00000004 整合式畫筆數位板用於輸入。
NID_EXTERNAL_PEN 0x00000008 外部畫筆數位板用於輸入。
NID_MULTI_INPUT 0x00000040 支援多個輸入的輸入數位板會用於輸入。
NID_READY 0x00000080 輸入數位板已準備好進行輸入。 如果此值未設定,表示平板電腦服務已停止、不支援數位板,或尚未安裝數位板驅動程式。

 

檢查NID_* 值是檢查用戶電腦功能以設定應用程式以進行觸控、手寫筆或非平板電腦輸入的實用方式。 例如,如果您有動態使用者介面(UI),而且想要自動設定其中一些介面,您可以檢查是否有NID_INTEGRATED_TOUCH、NID_MULTITOUCH,而且可以在使用者第一次執行應用程式時取得最大觸碰次數。

注意

SM_GETSYSTEMMETRICS有一些固有的限制。 例如,不支援隨插即用。 基於這個理由,當使用此函式作為永久設定的方法時,請小心使用。

 

註冊以接收 Windows Touch 輸入

在接收 Windows Touch 輸入之前,應用程式必須先註冊才能接收 Windows Touch 輸入。 藉由註冊應用程式視窗,應用程式會指出它與觸控相容。 應用程式註冊其視窗之後,當視窗上輸入時,Windows Touch 驅動程式的通知會轉送至應用程式。 當應用程式關閉時,它會取消註冊其視窗以停用通知。

注意

WM_TOUCH訊息目前為「貪婪」。在視窗上收到第一個觸控訊息之後,所有觸控訊息都會傳送到該視窗,直到另一個視窗接收焦點為止。

 

注意

根據預設,您會收到 WM_GESTURE 訊息, 而不是WM_TOUCH 訊息。 如果您呼叫 RegisterTouchWindow,您將停止接收WM_GESTURE訊息。

 

下列程式代碼示範應用程式如何在 Win32 應用程式中註冊以接收 Windows Touch 訊息。

RegisterTouchWindow(hWnd, 0);

處理 Windows Touch 訊息

您可以透過許多方式處理來自 Windows 作業系統中應用程式的 Windows Touch 訊息。 如果您正在設計 GUI 應用程式,請在函式中 WndProc 新增程式代碼來處理感興趣的訊息。 如果您正在設計 Microsoft Foundation Class (MFC) 或 Managed 應用程式,請新增感興趣的訊息處理程式。 下列程式代碼範例示範如何從 Windows 應用程式中的 WndProc 處理觸控訊息。

  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;

下列程式代碼示範如何實作訊息對應和訊息處理程式。 請注意,訊息必須在訊息對應中宣告,然後實作訊息的處理程式。 例如,在 MFC 應用程式中,這可以在對話框程式代碼中宣告。 另請注意OnInitDialog,對話框視窗的函式必須包含 RegisterTouchWindow 的呼叫,例如 RegisterTouchWindow(m_hWnd, 0)

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

觸控視窗會指出彈出視窗中的觸控。

Windows Touch 輸入