winform 实现控制输入法
作者:hebedich 发布时间:2022-05-01 11:35:38
标签:winform,控制输入法
这里文章写出来并不是为了炫耀什么,只是觉得发现些好东西就分享出来而已,同时也做个记录,方便以后查找
开始正文
1、先介绍本文会用到的windows的API,网上有很详细的资料,我这里就只简要说明一下
ImmGetContext(IntPtr hwnd):获取当前正在输入的窗口的输入法句柄
ImmSetOpenStatus(IntPtr himc, bool b):设置输入法的状态
InputLanguage类:提供方法和字段以管理输入语言;这是winform里面自带的输入法管理类,msdn上有详细资料
2、比如本系统安装有两个输入法:搜狗拼音 和 智能 ABC(注意:智能 ABC中间有个空格,用下划线就是要明确对比出来)。
3、使用InputLanguage类来显示指定的输入法。
思路很简单:先获取到操作系统中安装的所有输入法列表,然后循环列表,比对指定的输入法名称(名称可以设置在配置文件中,安装的时候,根据不同人的需要配置成不同的输入法),然后把找到的输入法设为当前输入法,代码如下:
//设置“搜狗拼音”为当前输入法
foreach (InputLanguage item in InputLanguage.InstalledInputLanguages)
{
if (item.LayoutName.Contains("搜狗拼音"))
{
InputLanguage.CurrentInputLanguage = item;
break;
}
}
//设置“智能 ABC”为当前输入法
foreach (InputLanguage item in InputLanguage.InstalledInputLanguages)
{
if (item.LayoutName.Contains("智能 ABC"))
{
InputLanguage.CurrentInputLanguage = item;
break;
}
}
//设置系统默认输入法为当前输入法
InputLanguage.CurrentInputLanguage = InputLanguage.DefaultInputLanguage;
3、解决输入法被禁用的假象。
思路也很简单,只需要重新激活输入法就行了,这里就用到上面的API方法了。
首先声明一个委托:
private delegate void fixImeDele();
private fixImeDele _fixime;
然后定义委托要实现的事情。
fixime = delegate
{
IntPtr HIme = ImmGetContext(this.Handle);
ImmSetOpenStatus(HIme, true);
};
最后执行委托就行了哦。
this.BeginInvoke(fixime);
最后完整代码如下:
public partial class Form1 : Form
{
[DllImport("imm32.dll")]
public static extern IntPtr ImmGetContext(IntPtr hwnd);//获取当前正在输入的窗口的输入法句柄
[DllImport("imm32.dll")]
public static extern bool ImmSetOpenStatus(IntPtr himc, bool b);//设置输入法的状态
private delegate void fixImeDele();
private fixImeDele fixime;
public Form1()
{
InitializeComponent();
}
private void txt搜狗拼音_Enter(object sender, EventArgs e)
{
//int index = InputLanguage.InstalledInputLanguages.IndexOf(InputLanguage.CurrentInputLanguage);
//设置“搜狗拼音”为当前输入法
foreach (InputLanguage item in InputLanguage.InstalledInputLanguages)
{
if (item.LayoutName.Contains("搜狗拼音"))
{
InputLanguage.CurrentInputLanguage = item;
break;
}
}
}
private void textBox3_Enter(object sender, EventArgs e)
{
//设置“智能 ABC”为当前输入法
foreach (InputLanguage item in InputLanguage.InstalledInputLanguages)
{
if (item.LayoutName.Contains("智能 ABC"))
{
InputLanguage.CurrentInputLanguage = item;
break;
}
}
}
private void txt系统默认_Enter(object sender, EventArgs e)
{
//设置系统默认输入法为当前输入法
InputLanguage.CurrentInputLanguage = InputLanguage.DefaultInputLanguage;
}
private void txtTrue_Enter(object sender, EventArgs e)
{
fixime = delegate
{
IntPtr HIme = ImmGetContext(this.Handle);
ImmSetOpenStatus(HIme, true);
};
this.BeginInvoke(fixime);
}
private void txtFalse_Enter(object sender, EventArgs e)
{
fixime = delegate
{
IntPtr HIme = ImmGetContext(this.Handle);
ImmSetOpenStatus(HIme, false);
};
this.BeginInvoke(fixime);
}
}
再给大家分享一个小问题的解决方法
wihform 默认的 ImeMode 值是NoControl
这不适合中文输入.
因为例如: 你每到一个控件都要切换一下输入法.
我们应该把父窗口 及所有子窗口 的 ImeMode 值 设置为 On
可是这样有个问题就是 它总是全角状态.
解决办法是:
在每个窗休的 Desinger.cs文件里找到
this.ImeMode = System.Windows.Forms.ImeMode.On;
替换为
this.ImeMode = System.Windows.Forms.ImeMode.OnHalf;
这样就ok了.


猜你喜欢
- 在项目开发中,我们经常会遇到表中的字段名和表对应实体类的属性名称不一定都是完全相同的情况,下面小编给大家演示一下这种情况下的如何解决字段名与
- 在SpringBoot中,当需要获取到配置文件数据时,除了可以用Spring自带的@Value注解外,SpringBoot提供了一种更加方便
- 本文主要介绍了spring-boot-maven-plugin报红解决方案,亲测有效,具体如下:<?xml version="
- 下载 Android SDK,官网:www.android.com 我相信很多人跟我一样,进不去。Android Studio 中文官网 w
- 判断某字符串是否为空,为空的标准是str==null或str.length()==01.下面是StringUtils判断是否为空的示例:St
- springmvc控制登录用户session失效后跳转登录页面,废话不多少了,具体如下:第一步,配置 web.xml <session
- 前言本文准确来讲是探讨如何用 Jackson 来序列化 Apache avro 对象,因为简单用 Jackson 来序列化 Apache a
- 适配器(Adapter)模式:适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一
- 1.效果图如下点击选择照相后,弹出如下选择对话框:2. Dialog实现布局<LinearLayout xmlns:android=&
- Spring Data JPA设置字段默认值在Column注解中写入以下两个属性,为什么自己查一下文档吧,即可实现字段默认值设置,并顺带解决
- Gateway什么是Gateway  由于Netflix的zuul发生问题,spring公司自己研发了一
- 本文实例讲述了C#实现的三种模拟自动登录和提交POST信息的方法。分享给大家供大家参考,具体如下:网页自动登录(提交Post内容)的用途很多
- 在Servlet2.5中,我们要实现文件上传功能时,一般都需要借助第三方开源组件,例如Apache的commons-fileupload组件
- 介绍记录将elasticsearch集成到spring boot的过程,以及一些简单的应用和helper类使用。接入方式使用spring-b
- 介绍Apache Kafka 是分布式发布-订阅消息系统,在 kafka官网上对 kafka 的定义:一个分布式发布-订阅消息传递系统。 它
- 有时我们在应用中会用到圆形头像,下面是利用CircleImageView实现圆形头像的演示,下面效果和代码,效果如图实现起来也比较简单,先在
- 什么是断点续传用户上传大文件,网络差点的需要历时数小时,万一线路中断,不具备断点续传的服务器就只能从头重传,而断点续传就是,允许用户从上传断
- 实践过程效果代码public partial class Form1 : Form{ public Form1()
- 本文实例为大家分享了Unity3D选择本地图片并加载的具体代码,供大家参考,具体内容如下①找到System.Windows.Forms.dl
- 在Springboot+Mybatis-plus不使用SQL语句进行多表添加操作我所遇到的问题准备工作在测试环境下模拟思维分解一下:创建出一