激活窗口关联的当前输入法:
::ImmAssociateContextEx(gamewnd, NULL, IACE_DEFAULT);
关闭窗口关联的当前输入法:
::ImmAssociateContextEx(gamewnd, NULL, NULL);
我们在游戏中聊天的时候,肯定需要用到输入法,输中文嘛。通常是这样一个过程:
1. 按回车,激活聊天控件
2. 按下 Ctrl + Space,切换到中文输入法
3. 然后开始输入中文
4. 最后回车,发送聊天信息
5. 聊天控件恢复正常状态
6. 关闭输入法
使得游戏窗口的“关联的当前输入法”切换为搜狗,然后才能输中文,输入完回车发送后,需要“关闭输入法”。
“关闭输入法”,因为如果不关闭,后续你按键施放技能的时候,比如1234,或者控制角色行走的时候,比如WASD,会显示在输入法工具栏上,而游戏窗口收不到这些按键消息,然后你的角色就处于失控状态,如果你这会儿正在pk,可能就没躲开敌人的技能,挂了。这时候你会觉得输入法特别烦人,而输入法工具栏的状态可能是这样:
而你的角色可能是这样:
所以聊天结束,“关闭输入法”很重要啊!有木有?关闭了输入法,输入法工具栏就不会出来烦你了,你就能继续快乐的PK了。
有一些细节需要阐述下,但是我对这方面底层并不了解,只是猜测:
1. 输入法应该是归进程管理的,当前进程应该同时只能有一种输入法,默认是英文,你聊天时按了Ctrl + Space,就是中文输入法了
2. ImmAssociateContextEx的作用应该是把窗口和进程管理的输入法关联起来,关联好了,你就能在该窗口中使用这个输入法;取消关联了,就不能使用(或者可能回归默认输入法,只能输英文?)。
3. 窗口的输入法状态(不是进程的输入法状态)应该有三种:“没有关联输入法”、“关联默认的英文输入法”、“关联中文输入法”
4. 窗口“没有关联输入法”,和“关联默认的英文输入法”,在我们看来,效果应该是一样的,只能输英文。
Windows IME相关函数, https://msdn.microsoft.com/zh-cn/dd318649