2020年8月13日 星期四

C# 切換中英文輸入法(C#如何判断当前输入法是中文输入还是英文输入,注意:是判断,而不是去切换中英文输入)

 https://www.twblogs.net/a/5c46a628bd9eee35b21efde4

在界面輸入時,有時需要限定輸入法。

在不自定義正則表達式或者其它輸入處理的情況下,切換中英文時與當前語言欄匹配,有以下的幾種系統方案:

InputLanguage方案

使用System.Windows.Forms.InputLanguage,判斷/設置當前輸入法狀態

 1     /// <summary>
 2     /// 獲取當前輸入法
 3     /// </summary>
 4     /// <returns></returns>
 5     private string GetCultureType()
 6     {
 7         var currentInputLanguage = InputLanguage.CurrentInputLanguage;
 8         var cultureInfo = currentInputLanguage.Culture;
 9         //同 cultureInfo.IetfLanguageTag;
10         return cultureInfo.Name;
11     }
 1     /// <summary>
 2     /// 切換輸入法
 3     /// </summary>
 4     /// <param name="cultureType">語言項,如zh-CN,en-US</param>
 5     private void SwitchToLanguageMode(string cultureType)
 6     {
 7         var installedInputLanguages = InputLanguage.InstalledInputLanguages;
 8 
 9         if (installedInputLanguages.Cast<InputLanguage>().Any(i => i.Culture.Name == cultureType))
10         {
11             InputLanguage.CurrentInputLanguage = InputLanguage.FromCulture(System.Globalization.CultureInfo.GetCultureInfo(cultureType));
12             CurrentLanguage = cultureType;
13         }
14     }

通過InputLanguage的設置,可以統一同一進程內的輸入法。比如切換成英文輸入法後,當前程序週期內一直是英文輸入狀態。

InputMethod附加屬性

System.Windows.Input.InputMethod,API原文給的註釋是:

可以提供用於管理和使用文本服務框架,它提供的替換文字,如語音和手寫的輸入法支持的交互功能

1. InputMethod下有依賴屬性PreferredImeConversionMode,可以限定輸入字符類型,同時切換語言欄的中英文狀態。

-- 此屬性設置了限定輸入字符後,可以通過人工切換輸入法,切換回其它輸入法。

2.InputMethod.IsInputMethodEnabled,也可以設置中英文輸入法限定

-- 一旦設置了,輸入控件的輸入法不可人工切換。除非重新設置IsInputMethodEnabled值。

 InputMethod適合程序週期內,不同輸入框分別有不同輸入法的情況。

 

比如下面倆個文本框的輸入法限定:

1     //通過InputMethod.PreferredImeConversionMode附加屬性,設置輸入框的輸入法輸入轉換模式,即限定輸入字符類型
2     InputMethod.SetPreferredImeConversionMode(InputTestTextBox0, ImeConversionModeValues.Alphanumeric);
3     InputMethod.SetPreferredImeConversionMode(InputTestTextBox1, ImeConversionModeValues.Native);

ImeConversionModeValues枚舉值列表如下:

 1   /// <summary>描述要執行的一種輸入法輸入轉換模式。</summary>
 2   [Flags]
 3   public enum ImeConversionModeValues
 4   {
 5     /// <summary>輸入的法使用本機字符 (平假名、 朝鮮語、 繁體中文) 轉換模式。</summary>
 6     Native = 1,
 7     /// <summary>輸入的法使用片假名轉換模式。</summary>
 8     Katakana = 2,
 9     /// <summary>輸入的法使用全形轉換模式。</summary>
10     FullShape = 4,
11     /// <summary>輸入的法使用羅馬字符轉換模式。</summary>
12     Roman = 8,
13     /// <summary>輸入的法使用字符代碼轉換模式。</summary>
14     CharCode = 16, // 0x00000010
15     /// <summary>輸入的方法不會執行任何輸入的轉換。</summary>
16     NoConversion = 32, // 0x00000020
17     /// <summary>輸入的法使用 EUDC (最終用戶定義的字符) 轉換模式。</summary>
18     Eudc = 64, // 0x00000040
19     /// <summary>輸入的法使用符號轉換模式。</summary>
20     Symbol = 128, // 0x00000080
21     /// <summary>輸入的法使用固定的轉換模式。</summary>
22     Fixed = 256, // 0x00000100
23     /// <summary>輸入的法使用字母數字的轉換模式。</summary>
24     Alphanumeric = 512, // 0x00000200
25     /// <summary>輸入的方法並不關心使用哪種輸入的轉換方法;實際的轉換方法是不確定的。</summary>
26     DoNotCare = -2147483648, // -0x80000000
27   }

以上倆方案的Demo:https://github.com/Kybs0/InputLanguageTestDemo 

 

PS:如果是winform程序,可以直接設置Control.ImeMode屬性

詳情可參考:https://blog.csdn.net/iluna/article/details/4903479


C#如何判断当前输入法是中文输入还是英文输入,注意:是判断,而不是去切换中英文输入

沒有留言:

張貼留言