如果在你的程序里需要输入很多的内容,比如各类单据,如果在进入每一个录入框的时候都能自动把输入法切换到合适的状态将会是一个很酷的特性,相比炫丽的界面而言打字到手抽筋的录入人员们对此会更加感兴趣。在winform中切换输入法是很简单的事情:
foreach (InputLanguage iL in InputLanguage.InstalledInputLanguages)
{
if (iL.LayoutName == "智能ABC")
{
InputLanguage.CurrentInputLanguage = iL;
break;
}
}
<!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin. http://dunnhq.com -->
这样子就能很轻松的吧输入法切换到智能ABC了。
但是这样子的效果是不完美的,这个方法不能指定IME的状态,也就是IME的转换状态。这个概念是只有远东地区的windows才存在的状态,因为对于英语国家来说输入根本不存在输入法,而法语,俄语等拉丁语系的拼音文字的语言都只需要简单的修改键映射关系就行了,只有受中文影响的东亚地区有输入法的概念,比如日文和朝鲜文,为了方便输入,这些IME中都有很多状态,比如微软日文输入法:
日文输入包含了全角半角平假名,全角半角片假名等录入的状态,还包括了:
普通,名字,对话和不转换四种假名到当用汉字的转换模式
汉语的输入法简单一些,不存在对汉字的转换,不过也存在为了中英交替录入(牛逼哄哄的日本人喜欢用片假名替换英文所以不存在交替录入)而存在的中英录入模式转换,中英标点符号装换,还有全角半角的转换:
如果是用的很古老的智能ABC的话,那么还存在双打和标准模式的切换。
对于这些五花八门的输入法中的输入模式,如果在选择了确定要输入法,同时也要确定要唯一定位到输入的模式,那么 InputLanguage 类的功能就捉襟见肘了。
在windows的文字服务IMM中对IME提供了ConvertionStatus的接口来确定输入法的工作模式,在Win32API中就是
ImmGetConversionStatus和ImmSetConversionStatus
这两个函数都有三个参数,一个是输入法IME的句柄,一个是mode,一个是sentence,最重要的就是mode和sentence这两个参数了,他们就是确定输入法状态的数据。经过测试发现,每个输入法的值都不一样,所以看MSDN去解析这两个int变量所对应的枚举值有哪些意义完全没必要,太复杂了,而我们只需要精确的切换到某个模式,只需要记录下这些模式下mode和sentence的值就行了。
下面是中文输入法的状态和mode值的对应关系表
双打模式(包括单双混合,比如微软输入法)
输入法状态 |
mode值 |
中文输入-半角-中文符号 |
-2147482623 |
中文输入-全角-中文符号 |
-2147482615 |
中文输入-半角-英文符号 |
-2147483647 |
中文输入-全角-英文符号 |
-2147483639 |
英文输入-半角-中文符号 |
-2147482624 |
英文输入-全角-中文符号 |
-2147482616 |
英文输入-半角-英文符号 |
-2147483648 |
英文输入-全角-英文符号 |
-2147483640 |
标准模式(全拼模式,比如智能ABC的标准模式)
输入法状态 |
mode值 |
中文输入-半角-中文符号 |
1025 |
中文输入-全角-中文符号 |
1033 |
中文输入-半角-英文符号 |
1 |
中文输入-全角-英文符号 |
9 |
英文输入-半角-中文符号 |
1024 |
英文输入-全角-中文符号 |
1032 |
英文输入-半角-英文符号 |
0 |
英文输入-全角-英文符号 |
8 |
由于不同的输入法对于模式的支持不同,比如搜狗支持的是标准模式,但是由于本身的功能又可以双打,但是设置模式却要用标准模式的值,而微软拼音是双打模式,而和同在双打模式智能ABC的sentence值又不一样,所以还是要根据具体的输入法测试后决定用什么数值来实现转换。
附1:
转换的代码:
首先注册Win32API的方法
[DllImport("imm32.dll")]
public static extern IntPtr ImmGetContext(IntPtr hWnd);
[DllImport("imm32.dll")]
public static extern bool ImmGetConversionStatus(IntPtr hIMC,
ref int conversion, ref int sentence);
[DllImport("imm32.dll")]
public static extern bool ImmSetConversionStatus(IntPtr hIMC, int conversion, int sentence);
<!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin. http://dunnhq.com -->
foreach (InputLanguage iL in InputLanguage.InstalledInputLanguages)
{
if (iL.LayoutName == "中文(简体)-搜狗拼音输入法")
{
InputLanguage.CurrentInputLanguage = iL;
break;
}
}
IntPtr prt = ImmGetContext(this.Handle);
int iMode = 1033;
int iSentence = 0;
if (!ImmSetConversionStatus(prt, iMode, iSentence))
{
MessageBox.Show("change error");
}
<!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin. http://dunnhq.com -->
这样就能把输入法确定为搜狗拼音,且为全角的数字符号和英文,且标点符号为中文标点。
附2:
日文输入法的值
日文输入法的假名和全半角模式由mode值控制
模式 |
mode 值 |
DirectInput |
25 |
Hiragana |
25 |
Full Width Katakana |
27 |
Full Width Alphanumeric |
24 |
Half Width Katakana |
19 |
Half Width Alphanumeric |
16 |
当用汉字的转化模式由 sentence 的值控制
附三:
棒子国输入法………没有用过,省略了吧
分享到:
相关推荐
在驱动和应用程序中获取精确的时间,可以精确到us,对于定时要求严的程序很有用。
时间精确计算程序.rar时间精确计算程序.rar时间精确计算程序.rar时间精确计算程序.rar时间精确计算程序.rar时间精确计算程序.rar时间精确计算程序.rar时间精确计算程序.rar
用精确线搜索的共轭梯度法,求问题的极小点
三联200倒丝机FX1N程序初稿脉冲直接输出精确.zip三菱PLC编程案例源码资料编程控制器应用通讯通信例子程序实例三联200倒丝机FX1N程序初稿脉冲直接输出精确.zip三菱PLC编程案例源码资料编程控制器应用通讯通信例子程序...
单片机开发者在编制各种应用程序时经常会遇到实现精确延时的问题,比如按键去抖、数据传输等操作都要在程序中插入一段或几段延时,时间从几十微秒到几秒。有时还要求有很高的精度,如使用单总线芯片DS18B20时,允许...
应用中断,精确的c语言延时程序,可以精确到mS,时间长度可调,程序整体结构严谨易懂,可移植性好,让你不再为延时而苦恼
Linux系统中实时仿真程序时间精确性分析.pdf
解抛物型方程的交替隐方向P-R差分格式的matlab程序实现。和精确解函数应用程序的时候只要修改精确解和右端项就可以.rar
公路工程及铁路工程平面线形中,主要线形类型为直线、圆曲线、缓和曲线。随着电脑在工程施工中的应用,尤其是部分应用程序的使用,使工程施工及其工程平面控制测量、施工放样的计算简单及准确化。
精确的经纬度转换程序,用于各种坐标的转换等,用处非常广泛
可以与任何应用程序一起使用使用Mac上的应用程序(包括Logic或Reason等生产应用程序以及iTunes或QuickTime等简单的音频播放器)中的音频制作虚拟音频设备。适用于任何输入设备从连接到Mac的物理音频设备中提取音频。...
人工智能在遥感船舶目标精确检测中的应用.pdf
拼音输入的极大的词汇量,对提高汉语水平,对标准语音和词汇应用帮助极大! 笔划输入的汉字书写笔画笔划笔顺,对错字别字倒笔字,有其无可替代的帮助! 软件不仅可用来教学自学,读书写字习读习写海量词,还可活指活脑活跃...
实际的单片机应用系统开发过程中,由于程序功能的需要,经常编写各种延时程序,延时时间从数微秒到 数秒不等,对于许多C51 开发者特别是初学者编制非常精确的延时程序有一定难度。本文从实际应用出 发,讨论几种实用的...
一种自适应精确守时算法在对时服务器中的应用一种自适应精确守时算法在对时服务器中的应用一种自适应精确守时算法在对时服务器中的应用一种自适应精确守时算法在对时服务器中的应用一种自适应精确守时算法在对时...
单片机c语言编写的秒表程序,精确到1ms
论文研究-基于区间直觉模糊数的得分函数与精确函数及其应用.pdf, 在模糊决策理论中,区间直觉模糊数的排序是一个非常重要的理论问题.运用得分函数和精确函数对区间直觉...
基于IBeacon+惯性实现精确实时导航小程序源码.zip基于IBeacon+惯性实现精确实时导航小程序源码.zip基于IBeacon+惯性实现精确实时导航小程序源码.zip基于IBeacon+惯性实现精确实时导航小程序源码.zip基于IBeacon+惯性...
区间幂集抽域及其在浮点程序分析中的应用,姜加红,陈立前,浮点变量在程序中的取值范围对浮点程序中相关性质的分析及运行时错误的检查具有重要意义.浮点运算的不精确性使得浮点变量的值范��
本文介绍了uC/OS-II和ARM系统应用中的精确定时