提高用户体验的编程细节系列内容之自动切换输入法 (http://www.cnblogs.com/mz121star/archive/2011/02/20/yonghutiyan.html)

来源:互联网 发布:java int转double类型 编辑:程序博客网 时间:2024/04/26 16:34

提高用户体验的编程细节系列内容之自动切换输入法

如果在你的程序里需要输入很多的内容,比如各类单据,如果在进入每一个录入框的时候都能自动把输入法切换到合适的状态将会是一个很酷的特性,相比炫丽的界面而言打字到手抽筋的录入人员们对此会更加感兴趣。在winform中切换输入法是很简单的事情:

 

代码
  foreach (InputLanguage iL in InputLanguage.InstalledInputLanguages)

            {

                
if (iL.LayoutName == "智能ABC")

                {

                    InputLanguage.CurrentInputLanguage 
= iL;

                    
break;

                }

            }

 

 

这样子就能很轻松的吧输入法切换到智能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中文输入-全角-英文符号-2147483839英文输入-半角-中文符号-2147482624英文输入-全角-中文符号-2147482616英文输入-半角-英文符号-2147483648英文输入-全角-英文符号-2147483640
标准模式(全拼模式,比如智能ABC的标准模式)
                                输入法状态mode值中文输入-半角-中文符号1025中文输入-全角-中文符号1033中文输入-半角-英文符号1中文输入-全角-英文符号9英文输入-半角-中文符号1024英文输入-全角-中文符号1032英文输入-半角-英文符号0英文输入-全角-英文符号8
由于不同的输入法对于模式的支持不同,比如搜狗支持的是标准模式,但是由于本身的功能又可以双打,但是设置模式却要用标准模式的值,而微软拼音是双打模式,而和同在双打模式智能ABC的sentence值又不一样,所以还是要根据具体的输入法测试后决定用什么数值来实现转换。

转换
代码
    [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);

            
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");

            }

 

的代码:

首先注册Win32API的方法

 

这样就能把输入法确定为搜狗拼音,且为全角的数字符号和英文,且标点符号为中文标点。

 日文输入法的值

日文输入法的假名和全半角模式由mode值控制
                       

模式mode 值DirectInput25Hiragana25Full Width Katakana27Full Width Alphanumeric24Half Width Katakana19Half Width Alphanumeric16
当用汉字的转化模式由 sentence 的值控制
                模式值般8名1话16无0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 月经推迟怎么办才能快点来 车载支架不粘了怎么办 otpc平板电脑无法开机怎么办 手表表轴掉了怎么办 鸡肉放冰箱臭了怎么办 鸡胸肉熟了腥怎么办 梦幻西游手游手机号换了怎么办 ppt做一半卡住了怎么办 吃了发霉的蚝油怎么办 蛋皮干燥起皮怎么办 wps卡顿资料没保存怎么办 手指受伤肉掉了怎么办 手机被wifi禁了怎么办 母乳一边是咸的怎么办 tcl电视蓝频了怎么办 长虹电视蓝频了怎么办 电视突然蓝频了怎么办 海信电视蓝频了怎么办 连网电视蓝频了怎么办 英雄联盟画面卡顿怎么办 长残了怎么办原来很帅 被吓到了怎么办没精神 宝宝吓着怎么办最有效 4个月婴儿易惊吓怎么办 心里有问题的人怎么办 减肥的时候想吃东西怎么办 大联盟ping很高怎么办 酷派手机弹广告怎么办 孕早期肚子紧绷怎么办 怀孕2个月同房了怎么办 怀孕前三月同房了怎么办 人流前三天同房了怎么办 人流后三天同房了怎么办 吃避孕药后月经量少怎么办 排卵日同房不想怀孕怎么办 排卵日同房没有怀孕怎么办 想怀孕想生儿子怎么办 到期大姨妈不来怎么办 怕怀孕月经不来怎么办 宫颈环扎后宫缩怎么办 来例假刺激外阴高潮了怎么办