目前我使用的版本是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版本也是
类似的处理吧。