Share via


針對應用程式進行疑難解答

本節提供常見問題的解決方案。

一般疑難排解

類別 描述
問題 我正在執行 Windows Server 2008 和 Windows Touch 功能無法運作。
原因 您尚未啟用桌面體驗。
解決方案 開啟 伺服器管理員 管理工具:按兩下 [開始],指向 [管理員 工具],然後按兩下 [伺服器管理員]。 按兩下左欄中的 [ 功能] 專案。 按兩下 [功能] 區段中的 [新增功能]。 選取 [ 桌面體驗],按 [下一步],然後按兩下 [ 安裝]。

 

類別 描述
問題 每當我在應用程式中快速移動手指時,會出現箭號,而且我的手勢或操作未正確註冊。
原因 當您不需要輕彈時啟用輕彈。
解決方案 當您想要停用時,即已啟用輕彈。 如需停用手寫筆筆跡的相關信息,請參閱使用滾動條進行移動流覽的舊版支援。

 

問題 我無法辨別滑鼠輸入和 Windows Touch 輸入。
原因 當使用者按兩下畫面時,Windows 會產生舊版支援的滑鼠訊息。
解決方案 您可以針對WM_LBUTTONDOWN和WM_LBUTTONUP訊息呼叫 GetMessageExtraInfo 來判斷來源。 下列程式代碼示範如何完成此作業。

C++
#define MOUSEEVENTF_FROMTOUCH 0xFF515700 

if ((GetMessageExtraInfo() & MOUSEEVENTF_FROMTOUCH) == MOUSEEVENTF_FROMTOUCH) { // Click was generated by wisptis / Windows Touch }else{ // Click was generated by the mouse. }

 

類別 描述
問題 如何? 在 Windows 7 上執行 Microsoft PixelSense 應用程式嗎?
原因 Windows Touch 和 Microsoft PixelSense 不相容。
解決方案 您必須以 Windows 7 平臺或 Microsoft PixelSense 平臺為目標。

 

操作和慣性疑難解答

類別 描述
問題 我的應用程式因故而凍結。 當我初始化物件介面時,我會收到存取違規。
原因 使用 IManipulationProcessorIInertiaProcessor 介面時,缺少 CoInitialize 的呼叫
解決方案 這可能是因為具現化 Windows Touch 元件物件模型 (COM) 物件而不呼叫 CoInitialize 所造成。 當您使用手勢將項目轉換成使用操作或慣性介面時,有時會發生這種情況。

 

類別 描述
問題 我的物件在翻譯時旋轉不正確。 單指旋轉無法正常運作。
原因 在對象上設定樞紐不正確。
解決方案 您未正確設定操作樞紐點。 將 PivotPointX PivotPointY 屬性設定為您要旋轉的物件或點中央,並將 PivotRadius 屬性設定為物件的半徑。

 

針對 Windows Touch 輸入進行疑難解答

類別 描述
問題 處理 WM_TOUCH 訊息之後,我停止收到界限意見反應。
原因 需處理WM_TOUCH 訊息即可取用訊息。
解決方案 您可能會取用 Windows Touch 訊息,而不將其轉送至 DefWindowProc,這會導致非預期的行為。 如需如何正確處理WM_TOUCH訊息的詳細資訊,請參閱開始使用Windows Touch 訊息

 

問題 我包括 windows.h,但它仍然說 ,WM_TOUCH 沒有定義。
原因 Targetver.h 中的 Windows 版本不正確。
解決方案 您尚未在項目中設定正確的 Windows 版本。 下列程式代碼說明在 Windows 7 中正確設定 Windows Touch 的 Windows 版本。
C++
#ifndef WINVER                  // Specify that the minimum required platform is Windows 7.
#define WINVER 0x0601           
#endif

 

問題 我的觸控輸入 x 座標和 Y 座標似乎無效。 它們是大於我預期的值,或是負值。
原因 您可能需要將觸控點轉換成圖元,或可能需要轉換螢幕座標。
解決方案 請確定您呼叫 TOUCH_COORD_TO_PIXELScreenToClient。 下列程式碼示範如何執行這項操作。
C++
      POINT ptInput;
      if (GetTouchInputInfo((HTOUCHINPUT)lParam, cInputs, pInputs, sizeof(TOUCHINPUT))){
        for (int i=0; i < static_cast<INT>(cInputs); i++){
          TOUCHINPUT ti = pInputs[i];                       
          if (ti.dwID != 0){                
            // Do something with your touch input handle.
            ptInput.x = TOUCH_COORD_TO_PIXEL(ti.x);
            ptInput.y = TOUCH_COORD_TO_PIXEL(ti.y);
            ScreenToClient(hWnd, &ptInput);
            points[ti.dwID][0] = ptInput.x;
            points[ti.dwID][1] = ptInput.y;
          }
        }
      }

注意
若要使用 ScreenToClient 函 式,您必須在應用程式中支援高 DPI。 如需支援高 DPI 的詳細資訊,請流覽 MSDN 的高 DPI 區段。

 

 

類別 描述
問題 我看不到WM_TOUCH訊息,但我知道 Windows Touch 正在運作,因為我看到WM_GESTURE訊息。
原因 缺少 RegisterTouchWindow呼叫。
解決方案 WM_TOUCH和WM_GESTURE訊息互斥。 如果您未呼叫 RegisterTouchWindow,則只會收到WM_GESTURE訊息。

 

類別 描述
問題 我注意到當我在應用程式中輸入時,從我手指向下觸碰到時,小的延遲。
原因 棕櫚拒絕會導致輸入延遲。
解決方案 如果在對 RegisterTouchWindow呼叫中設定TWF_WANTPALM,則會啟用手掌拒絕。 這會導致小(100 毫秒)的延遲,而軟體會測試輸入是否來自手指、手寫筆或使用者的手掌。 藉由呼叫已清除TWF_WANTPALM旗標的 RegisterTouchWindow 來停用手掌拒絕。

 

針對 Windows Touch 手勢進行疑難解答

類別 描述
問題 處理 WM_GESTURE 訊息之後,我停止收到界限意見反應。 或者,先前運作的手勢現在無法運作。
原因 用WM_GESTURE 訊息而不處理。
解決方案 您可能會取用 Windows Touch 訊息,而不將其轉送至 DefWindowProc,這會導致非預期的行為。 如需如何正確處理WM_GESTURE訊息的詳細資訊,請參閱開始使用Windows手勢

 

類別 描述
問題 我看不到WM_GESTURE訊息,但我知道 Windows Touch 正在運作,因為我看到WM_TOUCH訊息。
原因 呼叫 RegisterTouchWindow
解決方案 WM_TOUCH和WM_GESTURE訊息互斥。 如果您呼叫 RegisterTouchWindow,則不會收到WM_GESTURE訊息。

 

問題 我看不到我期望看到的所有手勢。 例如,我看到具有標識符 的手勢GID_PAN ,但看不到 GID_ROTATE
原因 默認不會啟用某些手勢,例如旋轉手勢。
解決方案 當您收到WM_GESTURENOTIFY訊息時,您必須呼叫 SetGestureConfig,如WM_GESTURENOTIFY參考中所述,或您需要新增WM_GESTURENOTIFY訊息的處理程式。 下列程式代碼示範如何實作處理程式,以啟用輪替支援。

C++
訊息對應。BEGIN_MESSAGE_MAP() ON_WM_CREATE() ... ...ON_MESSAGE(WM_GESTURENOTIFY、OnWindowsGestureNotify) END_MESSAGE_MAP() 

LRESULT CTestWndApp::OnWindowsGestureNotify( UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled ){ GESTURECONFIG gc; gc.dwID = GID_ROTATE; / 手勢標識符。 gc.dwWant = GC_ROTATE;您為GID_ROTATE啟用的手勢命令。 gc.dwBlock = 0;不要封鎖任何專案。 UINT uiGcs = 1;要設定的手勢數目。

BOOL bResult = SetGestureConfig(g_hMainWnd, 0, uiGcs, &gc, sizeof(GESTURECONFIG)] :if(!bResult) { @ 發生錯誤,請使用您慣用的記錄報告錯誤。 }

return 0; }

如需一般手勢設定的更多範例,請參閱 SetGestureConfig

 

類別 描述
問題 當我執行平移手勢時,應用程式中的自定義滾動條不會捲動。
原因 遺漏正確WM_*SCROLL 訊息的處理程式。
解決方案 您不會處理自定義滾動條中的所有WM_*SCROLL 訊息。 建議您處理 WM_GESTURE 訊息,而不是透過舊版支援保留自定義滾動條功能。 您需要支援訊息,如使用滾動條進行移動流覽的舊版支援一節所述。

 

類別 描述
問題 我收到手勢的延誤。
原因 輕彈可能會造成手勢的延遲。
解決方案 輕拍可能會導致應用程式接收 WM_GESTURE 訊息所需的時間延遲。 如需停用輕彈的相關信息,請參閱使用滾動條進行移動流覽的舊版支援。

 

程式設計指南