UE4支持WindowsTouch的技術嘗試

目前我使用的版本是UE4.11,還沒有對PC觸摸屏做技術支持,我看到國內外網站上有很多技術人員要求UE公司提供支持,令人可惜的是到目前還沒有支持。估計可能會在4.14版本支持。鑑於我們項目的情況,我有點等不及了。所以較深入的瞭解了目前這部分的代碼狀況,發現了些問題,並提供了一部分解決方法,在這裏和大家分享下:

看了下代碼,發現目前的窗口消息並沒有提供Touch消息的處理,目前所有的觸摸消息都當做鼠標左鍵處理,在藍圖中也是一樣。看了微軟的官方文檔,目前支持觸摸的windows操作系統必須是win7以上。這一點在UEBuildWindows.cs中是這麼描述的

if (SupportWindowsXP)
{

// Windows XP SP3 or higher required

InBuildTarget.GlobalCompileEnvironment.Config.Definitions.Add("_WIN32_WINNT=0x0502");

InBuildTarget.GlobalCompileEnvironment.Config.Definitions.Add("WINVER=0x0502");

}
else
{

// Windows Vista or higher required

InBuildTarget.GlobalCompileEnvironment.Config.Definitions.Add("_WIN32_WINNT=0x0600");

InBuildTarget.GlobalCompileEnvironment.Config.Definitions.Add("WINVER=0x0600");

}

很明顯的看出,當前版本還支持WS08和Vista。但是這兩個操作系統是不支持WindowsTouch消息的。也就是說如果要支持WindowsTouch,就需要用戶的操作系統至少升級到Win7及其Win7以上。這恐怕是UE目前不願意做技術支持的原因之一,這樣的話,那些正在使用08和Vista或者LONGHORN系統的用戶就可能流失。

好了,歸正題,如果我們要添加Touch處理怎麼做?下面我粗略說下思路(這些思路我已經在本機測試過,沒有問題)

第一:保證你的開發機是Win7或者Win7以上操作系統,本人使用的Win10開發

第二:將上面的代碼片段else部分修改爲如下

// Windows Vista or higher required

InBuildTarget.GlobalCompileEnvironment.Config.Definitions.Add("_WIN32_WINNT=0x0600");

InBuildTarget.GlobalCompileEnvironment.Config.Definitions.Add("WINVER=0x0601");

第三:在WindowsWindow.cpp的Initialize函數中添加

#if(WINVER >= 0x601)

// register the window for touch instead of gestures

RegisterTouchWindow(HWnd, 0);

#endif

註冊UE的窗口爲可觸摸窗口

第四:在WindowsApplication.cpp的AppWndProc函數中添加WM_TOUCH接受處理,類似下面代碼

case WM_TOUCH:
{

DeferMessage(CurrentNativeEventWindowPtr, hwnd, msg, wParam, lParam);

return 0;

}
break;

第五:在ProcessDeferredMessage函數中處理當前窗口的WM_TOUCH,僞代碼如下:

case WM_TOUCH:

{

//這裏爲觸摸的業務邏輯處理,如果不會寫,可以參看微軟官方的例子

}

break;

以上的思路我在項目已驗證沒有問題,並且在打包後的應用程序中也是正確無誤的。希望對大家有所幫助,另外觸摸手勢的處理是類似的原理。我個人估計UE4在4.14版本也是

類似的處理吧。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章