这几天在做一个注册页面,其中有一个真实姓名字段要求必须输入中文,于是想能不能在该真实姓名编辑框得到焦点的时候就将输入法切换为中文输入法呢?

于是就开始寻找前辈们的成功案例,果然功夫不费有新人,虽然费了很长时间。

开始是不知道如何着手,接下来找到了一个遍历系统安装输入法的C++类,并且可以设置激活任何一种已经安装的C++类,因此这就简单了,但是需要判断我们激活的

输入法是不是中文输入法。下面是网上对控制输入法的一个描述:(链接地址: http://lauwd.blog.163.com/blog/static/7605696920092202496313/)

要想控制输入法,首先要解决的问题是如果获得系统已安装的输入法信息。在视窗系统平台下,每个安装的输入法都在注册表中注册了相关信息。在“HKEY_CURRENT_USER\keyboard layout\preload”键下就能找到这些信息,键下由以1为基的递增数字做为值名(暂取名为数字号),其值的内容是个由八个数字组成的字符串(暂取名为代号,如"e0040804"),其中左4位是设备代码(device identifier),右4位是语言代码(language identifier)。例如上面:左e004指智能ABC,右0804指大陆中文。在MSDN中对所有代码做了周详的说明,如感兴趣请浏览MSDN相关内容。另外要说明一点的是在视窗系统98版本中输入法注册信息和上面说明略有不同,他是将已安装的输入法的数字号做为…\Preload下面的子键,而视窗系统2000将数字号做为…\Preload键下的值。

根据上面文章中的类我整理出来后上传到http://download.csdn.net/detail/fengbangyue/4134857处,但是后来我在使用过程中发现即便切换到中文了,但是如果以前切换的时候中文是出于英文状态的,那么用户也需要在一次从英文状态切换回中文输入状态。于是想可以再程序中判断当前输入法是英文状态吗,可以的话就把他切换到中文啊。在一次发现了这个方法,

详细描述在这里有完整的代码例子:http://blog.csdn.net/gxj1680/article/details/5270352

在这里摘抄几个函数:

 HIMC   hIMC;   DWORD   dwConv,   dwSent;   hIMC=ImmGetContext(m_hWnd);   ImmGetConversionStatus(hIMC,&dwConv,&dwSent);  if((dwConv   &   IME_CMODE_LANGUAGE)   !=   IME_CMODE_NATIVE)   {   dwConv   &=   ~IME_CMODE_LANGUAGE;   dwConv   |=   IME_CMODE_NATIVE;           //中文输入状态   }//标注1if   (!(dwConv   &   IME_CMODE_FULLSHAPE))     dwConv   |=   IME_CMODE_FULLSHAPE;     //全角   if   (!(dwConv   &   IME_CMODE_SYMBOL))           dwConv   |=   IME_CMODE_SYMBOL;           //中文标点 //标注2//若要切换输入法为半角,只需把上面的标注1判断改为如下即可(自己用到时有此要求,所以在原作者继承上自己改了下)/*if (dwConv & IME_CMODE_FULLSHAPE)dwConv &= ~IME_CMODE_FULLSHAPE;if (dwConv & IME_CMODE_SYMBOL)dwConv &= ~IME_CMODE_SYMBOL;*/ImmSetConversionStatus(hIMC,dwConv,dwSent);   //对输入法状态进行设置ImmReleaseContext(m_hWnd,hIMC);   //释放上下文资源
//另外
判断当前输入法是否打开(即是否非美式键盘的英文状态)
HKL  hKL = GetKeyboardLayout(0);
BOOL    bIme = ::ImmIsIME(hKL);
打开和禁止输入法
ImmAssociateContext(hWnd, hIMC); //hIMC是已保存的HIMChIMC = ImmAssociateContext(hWnd, NULL);
另外是前面朋友使用的经验:
同样对于日文输入法而言,可以通过上面的方法进行全半角切换,不过还有个前提:上面的方法需要打开IME才行,因为在“直接入力”(Direct Input)状态上面的方法不能切换全半角等状态,如果需要由“直接入力”(Direct Input)切换到其他如"ひらがな"等状态,需要通过::ImmSetOpenStatus(hImc, TRUE);打开IME,同样如果想由其他状态切换到“直接入力”(Direct Input),只需::ImmSetOpenStatus(hImc, FALSE);即可其实像Windows中的密码框,不管切换何种输入法输入的都是半角英文状态,用的也是::ImmSetOpenStatus这个函数有了前面几个这些函数对输入法的操作基本上是可以了,至于还会有什么问题我也不知道,现在我也只是写了一个简单的测试代码而已。
在切换输入法时,一般会先保存先前的输入法,也方便我们后来恢复。
ActivateKeyboardLayout(hCurKL,KLF_SUBSTITUTE_OK);       //切换输入法
写到这里忽然发现下面这两个函数不知道和前面封装的类有何区别,是不是要测试一下呢?
HKL   hKL[2];  HKL   hCurKL; hCurKL=GetKeyboardLayout(0);       //保存初始输入法   GetKeyboardLayoutList(2,hKL);     //获取输入法列表,只获取两项
GetKeyboardLayoutList函数用于获取输入法列表,前面封装的那个类用了很大的篇幅去获取输入法表,难道那个作者没有发现这个API,那么他又使用了LoadKeyboardLayout和ActivateKeyboardLayout两个API。
这些就先不说了,在此记录了输入法的基本切换控制,如果项目真的有这个需求的话,有这些资料实现起来也基本上没问他了。当然使用上面的API需要投文件和库#include   "imm.h"   #pragma   comment(lib,"imm32")
不知道需要#include <Ime.h>不。
有时间的话,把他封装一下,毕竟还是比较使用,刚开始的时候我真没有头绪哦。
文章很乱,头绪不清,可能第一次在公司发博客心不在焉的吧,回家了。。
不知道为什么发表后会有HTML乱码,全改用C++代码格式吧
												

WINDOWS下输入法中英文切换相关推荐

  1. 计算机桌面无法中英文切换,Win10输入法中英文切换不了怎么办?

    我们在使用电脑的过程中,打字是必须要进行的工作,但是有Win10用户碰到输入法中英文切换不了的情况,这就很尴尬了,打不了字,想工作玩耍都不行啊!那么该如何解决Win10中英文输入法无法切换的问题呢?下 ...

  2. 搜索计算机无法输入法,电脑输入法不能切换怎么办 电脑输入法中英文切换不了解决方法...

    电脑输入法不能切换怎么办? 输入法的需求是来源于键盘的限制.键盘原在打字机时代为英文字母而设计,但键盘只有一百来键,在没有软件的帮助下它是无法输入中文或其他大型形意文字的语言.不同语言.国家.或地区, ...

  3. Windows自带输入法中英文切换失灵

    针对该问题,网上方法很多,如果都不行可以看看这个.有时候这个失灵是突然的,而且会出现中英文状态显示是中文但是输入始终都是英文的问题,解决方案非常简单! step1:右键桌面右下角中文状态那个" ...

  4. Windows下QtCreator不能切换中文输入法

    打开QtCreator发现中文输入法不灵了,怎么都切不到中文输入法上,起先觉得是输入法的问题,果断又重新装了一个输入法,发现还是不行... 后来一个环境变量 QT_IM_MODULE 引起了我的注意, ...

  5. linux vscode输入法无法切换,vscode vim 在 mac osx 和 linux 下输入法自动切换

    目前 vscode 的 vim 插件支持在不同输入模式下自动切换输入法,可是 vscode 的配置目前不支持判断操作系统, 所以关于输入法切换的相关配置不能在 mac osx 和 linux 下通用, ...

  6. Mac-自带输入法中英文切换失效

    问题描述 系统为MacOS Sierra 版本号 10.12.3. 使用的系统自带的输入法,一直都相安无事,然后今天出现了问题 ,表现为: 1.中英文来回切换的时候,工具栏图标显示是切换回来了,但是并 ...

  7. windows下用cmd切换目录

    切换到盘符时(直接输入盘符名):> D: 切换到具体目录下 > cd blog/resource

  8. Windows下PHP版本切换

    环境选择appserv 在测试中发现phpstudy无法在apache中使用一下操作 下载地址 https://www.appserv.org/en/download/ 1)PHP版本下载 根据系统版 ...

  9. windows下cmd中切换路径与目录查看

    1.在原始路径时,若要回退到最前面的目录,即C: ----> cd / 2.查看当前路径下的所有目录 ---> dir 3.进入指定目录(此处进入mysql) ---> cd mys ...

最新文章

  1. 黄家懿:河北高校邀请赛 -- 二手车交易价格预测决赛答辩
  2. Java面试题之一 (转)
  3. 《2017年IT优先级调查》:重点考虑云、网络、端点安全
  4. 物料自运过帐的模拟和修正
  5. 写 Python 到底用什么编辑器好?鹅厂程序猿吵翻了
  6. php抢购排队是怎样做的,基于swoole的抢购排队通用中间件,适合抢购秒杀场景,跟具体业务解耦...
  7. H3C——路由策略和策略路由实例配置
  8. native react 更新机制_react-native热更新全方位讲解
  9. java数据文本格式转换_SpringMVC中Json数据格式转换
  10. 金额要用BigDecimal,原理分析
  11. 词汇学习系列(一):252个基本词根详解
  12. NPOI遍历excel表格
  13. 互联网发展的四个阶段总结
  14. 毛孔很大很难看该怎么处理
  15. 使用 VMware Server 在 Linux 上安装 Oracle RAC 10g
  16. Python常用模块-1
  17. php框架symfony,Symfony框架配置
  18. Serverless实践系列(四):网站监控脚本的实现
  19. 计算机学院早操规定,通知公告|南京邮电大学早操管理规定(暂行)
  20. 全国计算机等级考试c语言设计题,全国计算机等级考试 《C语言程序设计》习题.doc...

热门文章

  1. 华为消费者云的ServiceComb 微服务之旅
  2. flutter 打开设置面板进行基本设置
  3. 3.23期货品种每日早盘建议
  4. 估值近百亿,“创维三把手”酷开科技能否顺利赶考?
  5. 国庆旅游——独山、箬寮原始森林
  6. 便利贴--9{Cesium+js绘制多个点和多个线的图层,加标题}
  7. EasyExcel动态导出-动态头
  8. special effects - 星空宇宙背景特效
  9. Quasi_Newton
  10. 智慧城市每年商机超2万亿美元;中德嘉宾共话智慧城市建设 | 智慧城市周报