本文經原作者授權以原創方式二次分享,歡迎轉載、分享。
原文作者:唐宋元明清
原文地址:https://www.cnblogs.com/kybs0/p/10298697.html
C# 切換中英文輸入法
在界面輸入時,有時需要限定輸入法。
在不自定義正則表達式或者其它輸入處理的情況下,切換中英文時與當前語言欄匹配,有以下的幾種系統方案:
InputLanguage方案
使用System.Windows.Forms.InputLanguage[1],判斷/設置當前輸入法狀態;
獲取當前輸入法
///?<summary>///?獲取當前輸入法///?</summary>///?<returns></returns>private?string?GetCultureType(){var?currentInputLanguage?=?InputLanguage.CurrentInputLanguage;var?cultureInfo?=?currentInputLanguage.Culture;//同?cultureInfo.IetfLanguageTag;return?cultureInfo.Name;}
切換輸入法
///?<summary>///?切換輸入法///?</summary>///?<param?name="cultureType">語言項,如zh-CN,en-US</param>private?void?SwitchToLanguageMode(string?cultureType){var?installedInputLanguages?=?InputLanguage.InstalledInputLanguages;if?(installedInputLanguages.Cast<InputLanguage>().Any(i?=>?i.Culture.Name?==?cultureType)){InputLanguage.CurrentInputLanguage?=?InputLanguage.FromCulture(System.Globalization.CultureInfo.GetCultureInfo(cultureType));CurrentLanguage?=?cultureType;}}
通過InputLanguage
的設置,可以統一同一進程內的輸入法。比如切換成英文輸入法后,當前程序周期內一直是英文輸入狀態。
InputMethod附加屬性
System.Windows.Input.InputMethod
,API
原文給的注釋是:
可以提供用于管理和使用文本服務框架,它提供的替換文字,如語音和手寫的輸入法支持的交互功能
1) InputMethod
下有依賴屬性PreferredImeConversionMode
,可以限定輸入字符類型,同時切換語言欄的中英文狀態。
此屬性設置了限定輸入字符后,可以通過人工切換輸入法,切換回其它輸入法。
2)InputMethod.IsInputMethodEnabled
,也可以設置中英文輸入法限定
一旦設置了,輸入控件的輸入法不可人工切換。除非重新設置
IsInputMethodEnabled
值。
InputMethod
適合程序周期內,不同輸入框分別有不同輸入法的情況。
比如下面倆個文本框的輸入法限定:
//通過InputMethod.PreferredImeConversionMode附加屬性,設置輸入框的輸入法輸入轉換模式,即限定輸入字符類型InputMethod.SetPreferredImeConversionMode(InputTestTextBox0,?ImeConversionModeValues.Alphanumeric);InputMethod.SetPreferredImeConversionMode(InputTestTextBox1,?ImeConversionModeValues.Native);
ImeConversionModeValues
枚舉值列表如下:
///?<summary>描述要執行的一種輸入法輸入轉換模式。</summary>[Flags]public?enum?ImeConversionModeValues{///?<summary>輸入的法使用本機字符?(平假名、?朝鮮語、?繁體中文)?轉換模式。</summary>Native?=?1,///?<summary>輸入的法使用片假名轉換模式。</summary>Katakana?=?2,///?<summary>輸入的法使用全形轉換模式。</summary>FullShape?=?4,///?<summary>輸入的法使用羅馬字符轉換模式。</summary>Roman?=?8,///?<summary>輸入的法使用字符代碼轉換模式。</summary>CharCode?=?16,?//?0x00000010///?<summary>輸入的方法不會執行任何輸入的轉換。</summary>NoConversion?=?32,?//?0x00000020///?<summary>輸入的法使用 EUDC (最終用戶定義的字符)?轉換模式。</summary>Eudc?=?64,?//?0x00000040///?<summary>輸入的法使用符號轉換模式。</summary>Symbol?=?128,?//?0x00000080///?<summary>輸入的法使用固定的轉換模式。</summary>Fixed?=?256,?//?0x00000100///?<summary>輸入的法使用字母數字的轉換模式。</summary>Alphanumeric?=?512,?//?0x00000200///?<summary>輸入的方法并不關心使用哪種輸入的轉換方法;實際的轉換方法是不確定的。</summary>DoNotCare?=?-2147483648,?//?-0x80000000}
以上倆方案的Demo源碼[2]:
PS:如果是winform
程序,可以直接設置Control.ImeMode
屬性
參考[3]
參考資料
[1]
System.Windows.Forms.InputLanguage: https://docs.microsoft.com/zh-cn/dotnet/api/system.windows.forms.inputlanguage?view=netframework-4.7.2
[2]Demo源碼: https://github.com/Kybs0/InputLanguageTestDemo
[3]詳情可參考: https://blog.csdn.net/iluna/article/details/4903479