開始使用 Windows Touch 訊息
本節說明與在應用程式中取得 Windows Touch 輸入以運作相關的工作。
使用 Windows Touch 訊息時,通常會執行下列步驟:
- 測試輸入數位板的功能。
- 註冊以接收 Windows Touch 訊息。
- 處理訊息。
用於 Windows Touch 的訊息WM_TOUCH。 此訊息表示與數位板接觸的各種狀態。
測試輸入數位板的功能
GetSystemMetrics 函式可用來藉由傳入 nIndex 值 SM_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_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);
... ... ...
}
觸控視窗會指出彈出視窗中的觸控。
相關主題