激活窗口关联的当前输入法:

::ImmAssociateContextEx(gamewnd, NULL, IACE_DEFAULT);

关闭窗口关联的当前输入法:

::ImmAssociateContextEx(gamewnd, NULL, NULL);


我们在游戏中聊天的时候,肯定需要用到输入法,输中文嘛。通常是这样一个过程:

    1. 按回车,激活聊天控件

    2. 按下 Ctrl + Space,切换到中文输入法

    3. 然后开始输入中文

    4. 最后回车,发送聊天信息

    5. 聊天控件恢复正常状态

6. 关闭输入法


使得游戏窗口的“关联的当前输入法”切换为搜狗,然后才能输中文,输入完回车发送后,需要“关闭输入法”。

“关闭输入法”,因为如果不关闭,后续你按键施放技能的时候,比如1234,或者控制角色行走的时候,比如WASD,会显示在输入法工具栏上,而游戏窗口收不到这些按键消息,然后你的角色就处于失控状态,如果你这会儿正在pk,可能就没躲开敌人的技能,挂了。这时候你会觉得输入法特别烦人,而输入法工具栏的状态可能是这样:

unity 输入框取消输入回调_游戏开发

而你的角色可能是这样:

unity 输入框取消输入回调_控件_02

所以聊天结束,“关闭输入法”很重要啊!有木有?关闭了输入法,输入法工具栏就不会出来烦你了,你就能继续快乐的PK了。


    有一些细节需要阐述下,但是我对这方面底层并不了解,只是猜测:

        1. 输入法应该是归进程管理的,当前进程应该同时只能有一种输入法,默认是英文,你聊天时按了Ctrl + Space,就是中文输入法了

        2. ImmAssociateContextEx的作用应该是把窗口和进程管理的输入法关联起来,关联好了,你就能在该窗口中使用这个输入法;取消关联了,就不能使用(或者可能回归默认输入法,只能输英文?)。

        3. 窗口的输入法状态(不是进程的输入法状态)应该有三种:“没有关联输入法”、“关联默认的英文输入法”、“关联中文输入法”

        4. 窗口“没有关联输入法”,和“关联默认的英文输入法”,在我们看来,效果应该是一样的,只能输英文。


Windows IME相关函数, https://msdn.microsoft.com/zh-cn/dd318649


unity 输入框取消输入回调_输入法_03