前言
最近我在打算实现文本框输入的时候,碰到了无法输入中文,或者输入法的候选词提示无法显示的问题。打算在此记录的自己的踩坑经验希望对你的开发有所帮助,本文首发在。
如何解决
这里提一嘴,目前出问题的项目模板是DesktopGL ,如果是WindowDX等其他模板暂时不会出现问题。
一、使用IMEHelper库
当然不使用库也是没问题的,可以用monogame提供的TextInput事件,也可以成功输出中文,如果不是DesktopGL 的项目。这个库直接一步到位无需修改,这里我们只讨论DesktopGL 的情况如何使用。
IMEHelper提供我们一个例子,这里我假设你已经了解。如果你在使用后可以正常输入中文 ,且输入法候选词正常跳出,好了,你完全没必要继续看下去的必要了。
二、原因
那么如果出现问题的话该怎么办呢?这其实就是SDL的问题,在网上我了解到貌似是SDL默认是渲染自己的输入法窗口,所以我们应该自己关闭渲染输入法。但是问题在于SDL并没有提供关闭渲染的API(2.0.20版本貌似提供了一个开关,但我并不了解SDL所以不清楚应该如何使用)所以我们要自己编译一个SDL库。
2.1、 使用VS2019 编译SDL
在使用SDL之前先了解一下这几个API
- SDL_StartTextInput
- SDL_StopTextInput
- SDL_SetTextInputRect
- SDL_IsTextInputActive
同时 官方教程 里面简单描述了这几个API的作用,这里不在赘述。
在编译之前我们应该下载SDL源码,这里选用的版本是2.0.20。
用VS打开VisualC目录的项目,修改src\video\windows\SDL_windowskeyboard.c。在函数IME_Init中找到如下代码块,删除else语句即可。
if (WIN_ShouldShowNativeUI())
videodata->ime_uiless = SDL_FALSE;
else
videodata->ime_uiless = UILess_SetupSinks(videodata);
修改完毕后我们选择Release x64(游戏平台所需的版本)生成解决方案。在输出目录找到SDL2.dll文件保存到你游戏项目的根目录,然后替换项目中的SDL2.dll文件即可。这里以在x64为例分别介绍调试和发布时如何使用自己编译的SDL。
2.2、调试
这个比较麻烦因为每次都会重新生成项目,我也找不到模板用的SDL在那个文件,所以这里用一个蠢办法,在项目的生成后事件中使用这行命令
copy $(ProjectDir)\SDL2.dll $(OutDir)\runtimes\win-x64\native\
2.3、发布
只需要替换发布时的SDL2.dll文件即可