在工作中遇到这样一个问题,在系统使用过程中,输入法会变灰导致无法使用输入法输入文字,就好像输入法被禁用了没有启用似的。对此,在这里做个备录

这里文章写出来并不是为了炫耀什么,只是觉得发现些好东西就分享出来而已,同时也做个记录,方便以后查找

开始正文

1、先介绍本文会用到的windows的API,网上有很详细的资料,我这里就只简要说明一下

  ImmGetContext(IntPtr hwnd):获取当前正在输入的窗口的输入法句柄

  ImmSetOpenStatus(IntPtr himc, bool b):设置输入法的状态

  InputLanguage类:提供方法和字段以管理输入语言;这是winform里面自带的输入法管理类,msdn上有详细资料

2、比如本系统安装有两个输入法:搜狗拼音 和 智能 ABC(注意:智能 ABC中间有个空格,用下划线就是要明确对比出来)。

3、使用InputLanguage类来显示指定的输入法。

  思路很简单:先获取到操作系统中安装的所有输入法列表,然后循环列表,比对指定的输入法名称(名称可以设置在配置文件中,安装的时候,根据不同人的需要配置成不同的输入法),然后把找到的输入法设为当前输入法,代码如下:

  

  1. //设置“搜狗拼音”为当前输入法
  2. foreach (InputLanguage item in InputLanguage.InstalledInputLanguages)
  3. {
  4. if (item.LayoutName.Contains("搜狗拼音"))
  5. {
  6. InputLanguage.CurrentInputLanguage = item;
  7. break;
  8. }
  9. }
  10.  
  11. //设置“智能 ABC”为当前输入法
  12. foreach (InputLanguage item in InputLanguage.InstalledInputLanguages)
  13. {
  14. if (item.LayoutName.Contains("智能 ABC"))
  15. {
  16. InputLanguage.CurrentInputLanguage = item;
  17. break;
  18. }
  19. }
  20.  
  21. //设置系统默认输入法为当前输入法
  22. InputLanguage.CurrentInputLanguage = InputLanguage.DefaultInputLanguage;

3、解决输入法被禁用的假象。

  思路也很简单,只需要重新激活输入法就行了,这里就用到上面的API方法了。

  首先声明一个委托:

  

  1. private delegate void fixImeDele();
  2. private fixImeDele _fixime;

  然后定义委托要实现的事情。

  1. fixime = delegate
  2. {
  3. IntPtr HIme = ImmGetContext(this.Handle);
  4. ImmSetOpenStatus(HIme, true);
  5. };

  最后执行委托就行了哦。

  1. this.BeginInvoke(fixime);

最后完整代码如下:

  1. public partial class Form1 : Form
  2. {
  3. [DllImport("imm32.dll")]
  4. public static extern IntPtr ImmGetContext(IntPtr hwnd);//获取当前正在输入的窗口的输入法句柄
  5. [DllImport("imm32.dll")]
  6. public static extern bool ImmSetOpenStatus(IntPtr himc, bool b);//设置输入法的状态
  7.  
  8. private delegate void fixImeDele();
  9. private fixImeDele fixime;
  10.  
  11. public Form1()
  12. {
  13. InitializeComponent();
  14.  
  15. }
  16.  
  17. private void txt搜狗拼音_Enter(object sender, EventArgs e)
  18. {
  19. //int index = InputLanguage.InstalledInputLanguages.IndexOf(InputLanguage.CurrentInputLanguage);
  20. //设置“搜狗拼音”为当前输入法
  21. foreach (InputLanguage item in InputLanguage.InstalledInputLanguages)
  22. {
  23. if (item.LayoutName.Contains("搜狗拼音"))
  24. {
  25. InputLanguage.CurrentInputLanguage = item;
  26. break;
  27. }
  28. }
  29.  
  30. }
  31.  
  32. private void textBox3_Enter(object sender, EventArgs e)
  33. {
  34. //设置“智能 ABC”为当前输入法
  35. foreach (InputLanguage item in InputLanguage.InstalledInputLanguages)
  36. {
  37. if (item.LayoutName.Contains("智能 ABC"))
  38. {
  39. InputLanguage.CurrentInputLanguage = item;
  40. break;
  41. }
  42. }
  43. }
  44.  
  45. private void txt系统默认_Enter(object sender, EventArgs e)
  46. {
  47. //设置系统默认输入法为当前输入法
  48. InputLanguage.CurrentInputLanguage = InputLanguage.DefaultInputLanguage;
  49. }
  50.  
  51. private void txtTrue_Enter(object sender, EventArgs e)
  52. {
  53. fixime = delegate
  54. {
  55. IntPtr HIme = ImmGetContext(this.Handle);
  56. ImmSetOpenStatus(HIme, true);
  57. };
  58. this.BeginInvoke(fixime);
  59.  
  60. }
  61.  
  62. private void txtFalse_Enter(object sender, EventArgs e)
  63. {
  64. fixime = delegate
  65. {
  66. IntPtr HIme = ImmGetContext(this.Handle);
  67. ImmSetOpenStatus(HIme, false);
  68. };
  69. this.BeginInvoke(fixime);
  70. }
  71. }

winform 如何控制输入法的更多相关文章

  1. C#的winform中控制TextBox中只能输入数字

    C#的winform中控制TextBox中只能输入数字 private void textBox3_KeyPress(object sender, System.Windows.Forms.KeyPr ...

  2. winform 按键控制

    用ADSW来控制前后左右,J表示开火,J不能连续按 _+表示速度档位. DateTime _LastPress = DateTime.MinValue; Keys _PrevKey = Keys.No ...

  3. SPREAD for Windows Forms 控制输入法

    enc = System.Text.Encoding.GetEncoding("shift-jis") datamodel = CType(FpSpread1.ActiveShee ...

  4. c# winform richtextbox控制每行颜色 + 滚动条始终滚动到最底部

    /// <summary> /// 输出 /// </summary> /// <param name="content"></param ...

  5. Android输入法开发

    1. 概念 * IMF: 输入法框架(Input Method Framework) * IM: 输入法(Input Method) * IMS: 输入法服务(Input Method Service ...

  6. 两个port贴合七夕主题,百度输入法的“情感营销”策略

        一年一度的七夕佳节是情侣.夫妻之间传情达意.诉说衷肠的最佳时节.基于这一背景.一些传统企业.互联网公司也会针对性的推出一些营销策划,使产品和服务更贴近用户需求,更"接地气" ...

  7. Android中的输入法

    提起输入法我就想到了Edittext,输入法可以自动根据inputType来改变键盘的布局,在支付钱包中还特别隐藏的系统自带的输入法,直接让用户用软件自己的输入法,提高了安全性.所以,我们应该对输入法 ...

  8. 为 Android 平台开发一个输入法

    学习目标: 实现新的输入法 学习目的: 掌握Android输入法框架 学习收获: Android 1.5 新特色之一就是输入法框架(Input Method Framework,IMF),正是它的出现 ...

  9. C# textbox中输入时加限制条件 // C#Winform下限制TextBox只能输入数字 // 才疏学浅(TextBox 小数点不能在首位+只能输入数字)

    textbox中输入时加限制条件 分类: C# winform2008-08-26 08:30 306人阅读 评论(0) 收藏 举报 textbox正则表达式object 1.用正则表达式! 2.使用 ...

随机推荐

  1. centos6.7下编译安装lamp环境

    编译C源代码: 前提:提供开发工具及开发环境 通过“包组”提供开发组件,CentOS 6: "Development Tools", "Server Platform D ...

  2. JS中cookie的基本使用

    cookie是本身是HTML中ducument中的一个属性,可以用来保存一些简单的数据信息,比如用户名.密码等,提高一些网站的用户体验度.下面就来简单的说说cookie,它有下面几个特性: 1.有过期 ...

  3. Android消息推送完美方案[转]

    转自 Android消息推送完美方案 推送功能在手机应用开发中越来越重要,已经成为手机开发的必须.在Android应用开发中,由于众所周知的原因,Android消息推送我们不得不大费周折.本文就是用来 ...

  4. ASP.NET MVC5学习笔记之Filter基本介绍

    Filter是ASP.NET MVC框架提供的基于AOP(面向方面)设计,提供在Action执行前后做一些非业务逻辑通用处理,如用户验证,缓存等.现在来看看Filter相关的一些类型信息. 一.基本类 ...

  5. ASP.NET MVC4学习笔记之Controller激活的扩展

    一. 为什么要进行扩展 在前面的分析中,我们知道默认的Controller激活系统只能实例化无参构造函数的Controller类型,但在某些情况一下,我们希望某些服务的实例能够自动注入到Control ...

  6. Linux之kernal分析与启动20160610

    说一下LINUX内核的分析与启动: 一. 内核启动流程,据此配置内核(机器ID) 1.1 修改Makefile 1.2 选择默认配置 : make s3c2410_defconfig 1.3 make ...

  7. python 上下文管理器

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 上下文管理器(context manager)是Python2.5开始支持的一种语 ...

  8. i++与++i的误解

    javap -c xx.class {i=0i=i++}0: bipush 02: istore_1 stack ->var13: iload_1 var1->stack4: iinc 1 ...

  9. Web Design:给实验室UI们的一堂课(上)

    实验室的UI越来越水,设计什么的做的一塌糊涂,所以拖了很久,就想给他们讲一下设计或者说入门吧,上周末才倒出来时间. 这里放上PPT和讲稿吧,懒得去整理板式了. 主要讲了一下Web Design怎么做, ...

  10. JS对文本框值的判断

    JS判断只能是数字和小数点(摘录自其它资料,在此发表只为个人以后使用查找方便) 1.文本框只能输入数字(不包括小数点) <input onkeyup="this.value=this. ...