none
UWP不使用XAML怎么能获取中文输入? RRS feed

  • 问题

  • 我用 DirectX 11 without XAML 模板建立了一个游戏工程。

    我的游戏需要跨平台,所以游戏中的UI都是用图片画的,这样一来我就用不到XAML系统了。

    可是不用XAML系统,我发现我没有办法让中文输入法的备选框弹出来。

    在操作系统的任务栏上我已把输入法切换成微软拼音。

    可是我在按下键盘时按键对应的字母会直接出发WM_CHAR事件通知我的程序,而且文字备选框也不出现。

    我想实现的就是在不用XAML系统的情况下能向我的程序中输入中文,

    这个问题之前问过,没人知道。现在都过去2年多了,当年的Windows8.1开发环境都统一成UWP了,不知我的这个问题现在有没有办法解决?

    2019年9月26日 5:18

全部回复

  • 对于DirectX程序来说Win8时期的方法在UWP中没变化。

    https://docs.microsoft.com/en-us/previous-versions/windows/apps/jj247546(v=vs.105)?redirectedfrom=MSDN

    另外:如果要支持屏幕键盘,参看这个方法,同样Win8的方法现在依然在用。

    https://code.msdn.microsoft.com/windowsapps/Touch-keyboard-sample-43532fda

    • 已编辑 [-] 2019年9月26日 7:16
    2019年9月26日 7:14
  • 我用第一条链接中的方法进行了测试,但是有编译错误:

    ref class InputBufferTextBox sealed
    {
    ...
    	InputBufferTextBox(Windows::UI::Core::CoreWindow^ parentWindow,
    		int x, int y, int width, int height,
    		Platform::String^ initialText,
    		Windows::Phone::UI::Core::CoreInputScope inputScope);
    ...
    }
    
    1>F:\SVN\Blackjack2019.mix\App\proj.UWP\GameApp\InputBufferTextBox.h(7,55): error C2039: 'Phone': is not a member of 'Windows'

    我又下载了第二条链接中的示例程序,编译也有错误:

    第一处:

    vccorlib.h
    
    static auto __typeCode = ::Platform::Type::GetTypeCode(::Platform::Details::RemoveHat<__TBoxValue>::type::typeid);


    1>C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.23.28105\include\vccorlib.h(1560,1): error C3946: 'T': typeid cannot be applied to this type


    第二处:

    ::Platform::Object ^__boxValue = Details::CreateValue(__typeCode, &__valueArg);


    1>C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.23.28105\include\vccorlib.h(1561,1): error C3536: '__typeCode': cannot be used before it is initialized


    第三处:

    ::Platform::Object ^__boxValue = Details::CreateValue(__typeCode, &__valueArg);


    1>C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.23.28105\include\vccorlib.h(1561,1): error C2664: 'Platform::Object ^Platform::Details::CreateValue(Platform::TypeCode,const void *)': cannot convert argument 1 from 'int' to 'Platform::TypeCode'

    我建立的工程使用的是‘DirectX 12 App (Universal Windows C++/CX)’模板。

    我想在今天这个Windows Phone 8 与 Windows 8 合并成 UWP 的时代下,可能早先 Windows Phone 8 的API已不能在最新的UWP环境下使用了吧!

    我使用的环境是 Visual Studio 2019 最新更新

    我要开发的项目是游戏,因为游戏中不适合使用XAML,所以我必须掌握如何能不用XAML获取中文输入的方法。

    获取英文输入当前是OK的,响应WM_CHAR事件就可以。但中文输入因为需要由输入法提供,所以这个我是没有办法简单的获得。

    2019年9月27日 0:53
  • 第二个是为了使用软键盘,具体的我也没试过。第一个需要添加Mobile SDK。

    如果你开发的应用是用于Phone的,那么需要添加这个SDK,如果你不需要支持Phone,那么应该创建传统桌面程序,然后使用桌面桥转换为UWP程序,在传统桌面程序中按照以下链接操作。

    https://docs.microsoft.com/en-us/windows/win32/dxtecharts/using-an-input-method-editor-in-a-game


    • 已编辑 [-] 2019年9月27日 2:59
    2019年9月27日 2:59
  • 我的游戏面向的平台不包括Phone

    我希望我的游戏可以在 Windows Store 上架并且将来可以发布到 Xbox One。

    对应的硬件设备就是 台式电脑、Surface、Xbox One主机。

    桌面桥我先前看过文档说明,上面说也不是所有的Win32程序都能顺利用桌面桥变成UWP。

    而我的游戏用了一个叫SDL的跨平台开发库,这个库的UWP实现在VS2019发布检测时报出用到了不支持的函数。所以我想我就算是用这个SDL库的Win32版本通过桌面桥想变成UWP的话,也不会成功的。

    我两年前用DirectXTK写过一套在UWP下的游戏底层实现。所以我现在用那套底层就可以完成在UWP下对接上我的游戏逻辑了。

    目前唯一缺少的就是在UWP下显示中文输入法这一条。

    你给我的地址里说到的IME是让我自己画图展示中文输入法的备选词。但我看Windows商店里有的游戏是可以直接弹出输入法程序自己的备选词展示框的。我也是想实现这样的效果。

    我的猜想就是可能会有一个API让我设定一个矩形来表示我的图形输入框的边界范围,然后操作系统会根据这个边界范围自动把输入法程序的备选字框在这个矩形附近弹出。

    2019年9月27日 3:21
  • 但我看Windows商店里有的游戏是可以直接弹出输入法程序自己的备选词展示框的。

    你怎么知道人家没有使用XAML?或许人家是用XAML,然后去实现ITextProvider和IValueProvider。我记得实现这两个接口需要CoreView,不过记不清了,请自己确认一下。如果这两个接口不需要XAML的话,岂不是正合你意。当然是不是实现了这两个接口后就能行,我也不确定,毕竟没亲自试过。另一种方法是使用XAML,然后弄一个透明输入框。

    补充:一般游戏都分为真全屏、伪全屏(无边框最大化窗口)和窗口三种模式,在真全屏模式下按理说是无法显示输入法自己选词框的,上面让你自己画的那种方法应该针对的就是这种情况。

    • 已编辑 [-] 2019年9月27日 5:18
    2019年9月27日 4:45
  • 先说声谢谢,帮我回了几次了,这么有耐心。

    你说的有道理,确实有可能人家是用了一个没有边框的XAML控件。先前我的第一款在Windows Store上架的游戏也是这么解决中文输入的。但我感觉这样很别扭,觉得不是正解。

    我的游戏是打算做伪全屏的。

    我看Visual Studio里有 'DirectX 11 and XAML App' 和 'DirectX 12 App' 这么两个模板,所以我才想,既然没有 'DirectX 12 and XAML App'那就很有可能在目前最新的UWP中已经有很简单的方式可以让游戏程序脱离XAML去工作了。

    我目前的期望:

    1.伪全屏下用UWP自身的API能让选词框弹出来最好。

    2.如果不行,用UWP自己的API可以用IME的方式实现也可以。

    目前我的困难就是:

    这些API是什么我不知道啊!我的UWP开发才刚刚开始,并没有入门呢!这些API要在微软哪里查我都不知道。

    或者这些内容相关的中英文的数语是什么,我自己去google上找也可以。

    感谢帮助。我给一个我的游戏目前Win32和Android版本的下载地址,来证明一下,我真的是能干事儿的人,不是瞎矫情,我只是想自己的游戏技术做得更规矩。
    http://www.quandianwan.com/blackjack/

    2019年9月27日 5:44
  • 1. 微软的资料很难找。UWP、DirectX和Windows相关的API都是分开的,Windows部分新旧API也是分开的,很多旧的API不能在UWP里用,但其实提供了新的API,不过根本搜不到。我一般都是先到论坛里面问,绝大多数问题能通过这种方式解决。

    2. 看你给出的链接,似乎你的游戏以D2D为主,这样的话还是XAML加SwapChainPanel更合适。

    补充:“DirectX 11 and XAML App”这种方式主要用于D2D开发,之所以DirectX12没有这个是因为DirectX12在D2D方面没有新东西。
    • 已编辑 [-] 2019年9月27日 6:16
    • 已标记为答案 lihuipeng49 2019年9月27日 6:31
    • 取消答案标记 lihuipeng49 2019年10月1日 8:29
    2019年9月27日 6:11
  • 抱歉。我先前认为我问错了问题,所以想改变一个新问法。

    而且现在我才知道,会在不同论坛中看到发贴的是同一批人。

    之后我会调整问问题的方案的。

    2019年10月1日 8:31