如果在你的程序裡需要輸入很多的內容,比如各類單據,如果在進入每一個錄入框的時候都能自動把輸入法切換到合適的狀態將會是一個很酷的特性,相比炫麗的界面而言打字到手抽筋的錄入人員們對此會更加感興趣。在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
由於不同的輸入法對於模式的支持不同,比如搜狗支持的是標准模式,但是由於本身的功能