首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# WinForms 智慧輸入法自動切換:InputLanguage 類別完整實戰

     編輯:關於C語言

需求背景

Windows 系統通常安裝多種輸入法 (IME)。資料錄入時頻繁手動切換 (如中英文、全半形) 降低效率。參考 Access 等專業應用:根據欄位屬性 (如「姓名」自動切中文、「電話」自動切英文) 自動切換 IME,大幅提升使用者體驗。

核心類別:System.Windows.Forms.InputLanguage

密封類別,提供靜態屬性與方法管理當前執行緒的輸入法:

  • CurrentInputLanguage (get/set):取得/設定當前執行緒 IME。
  • DefaultInputLanguage (get):系統預設 IME。
  • InstalledInputLanguages (get):InputLanguageCollection,列舉系統安裝的所有 IME。
  • LayoutName (get):IME 在系統托盤顯示的名稱 (如「Microsoft Pinyin」)。

完整範例:IME 選擇器與自動同步

建立 WinForms 專案,放置 RichTextBox (輸入區)、ComboBox (IME 清單)、Button (離開)。

1. 表單載入:填充 ComboBox 並選中當前 IME


private void Form1_Load(object sender, EventArgs e)
{
    var ilc = InputLanguage.InstalledInputLanguages;
    foreach (InputLanguage il in ilc)
        comboBox1.Items.Add(il.LayoutName);

    // 設定預設選項為當前執行緒 IME
    comboBox1.SelectedIndex = ilc.IndexOf(InputLanguage.CurrentInputLanguage);
}

2. 使用者切換 ComboBox:即時套用至當前執行緒


private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
    var il = InputLanguage.InstalledInputLanguages[comboBox1.SelectedIndex];
    InputLanguage.CurrentInputLanguage = il;
}

3. 監聽系統級 IME 變更 (熱鍵切換、其他視窗焦點) 同步更新 ComboBox


// 表單建構子或 InitializeComponent 中訂閱事件
this.InputLanguageChanged += new InputLanguageChangedEventHandler(ChangeInput);

private void ChangeInput(object sender, InputLanguageChangedEventArgs e)
{
    int idx = InputLanguage.InstalledInputLanguages.IndexOf(e.InputLanguage);
    if (idx >= 0 && idx < comboBox1.Items.Count)
        comboBox1.SelectedIndex = idx;
}

4. 關鍵點總結

  • InputLanguageChanged 事件在 表單層級 觸發,可捕捉任何方式導致的 IME 變更。
  • InstalledInputLanguages 為唯讀集合,索引與 ComboBox.Items 索引一一對應。
  • 若需針對特定控制項 (如 TextBox) 設定專屬 IME,可處理控制項的 Enter/Leave 事件,設定 InputLanguage.CurrentInputLanguage (影響整個執行緒),或使用更底層的 ImmAssociateContext (需 P/Invoke) 實現控制項級隔離。

進階應用:欄位級自動切換


private void txtChinese_Enter(object sender, EventArgs e)
{
    SetInputLanguage("Microsoft Pinyin"); // 或 "Chinese (Traditional) - New Phonetic"
}

private void txtEnglish_Enter(object sender, EventArgs e)
{
    SetInputLanguage("US");
}

private void SetInputLanguage(string layoutName)
{
    foreach (InputLanguage il in InputLanguage.InstalledInputLanguages)
    {
        if (il.LayoutName.IndexOf(layoutName, StringComparison.OrdinalIgnoreCase) >= 0)
        {
            InputLanguage.CurrentInputLanguage = il;
            break;
        }
    }
}

結語

善用 InputLanguage 類別,只需數十行代碼即可賦予 WinForms 應用專業級的智慧輸入法體驗。核心在於 載入時同步、使用者手動切換時套用、系統熱鍵切換時回寫 UI 三者形成閉環。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved