本節說明在應用程式中使 Windows Touch 輸入功能正常運作的相關任務。
使用 Windows Touch 訊息時,通常會執行下列步驟:
- 測試輸入數位板的功能。
- 註冊以接收 Windows Touch 訊息。
- 處理訊息。
用於 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 中定義的常數,以測試輸入數位板的觸控功能。
| 名字 | 價值 | 描述 |
|---|---|---|
| 平板電腦配置_無 | 0x00000000 | 輸入數位板沒有觸控功能。 |
| NID_整合觸控 | 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)或受控應用程式,您可以新增感興趣的訊息處理常式。 下列程式代碼範例示範如何從 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);
... ... ...
}
觸碰視窗會顯示來自彈出視窗的觸碰。
相關主題