業務場景常要求特定輸入框 (如帳號、代碼、郵編) 絕對禁止中文輸入。單設 ImeMode = Off 卻無法阻止用戶在其他控件切換輸入法後 Tab 進入該框繼續輸入中文。本文總結三重防線組合拳,實現 Form 級、控件級、線程級的徹底屏蔽。
// 設計器或構造函數中
txtCode.ImeMode = ImeMode.Off; // 關閉輸入法
// 事件:取消輸入法切換嘗試
private void txtCode_InputLanguageChanging(object sender, InputLanguageChangingEventArgs e)
{
e.Cancel = true; // 禁止切換
}
private void SwitchToForm2()
{
// 關鍵:在顯示目標 Form 前重置輸入法
InputLanguage.CurrentInputLanguage = InputLanguage.DefaultInputLanguage;
this.Hide();
form2.Show();
}
private void ForceDefaultInputLanguage()
{
// 某些舊版微軟拼音輸入法直接切 DefaultInputLanguage 無效
// 策略:先切換到「非微軟」中文輸入法,再切默認
int targetIndex = -1;
for (int i = 0; i < InputLanguage.InstalledInputLanguages.Count; i++)
{
if (!InputLanguage.InstalledInputLanguages[i].LayoutName.Contains("微軟"))
{
targetIndex = i; break;
}
}
if (targetIndex >= 0)
InputLanguage.CurrentInputLanguage = InputLanguage.InstalledInputLanguages[targetIndex];
InputLanguage.CurrentInputLanguage = InputLanguage.DefaultInputLanguage;
}
private void btnOpenForm2_Click(object sender, EventArgs e)
{
ForceDefaultInputLanguage(); // 1. 重置輸入法
this.Close(); // 2. 釋放當前 Form (避免雙 Form 實例干擾)
var f2 = new Form2();
f2.Show();
}
Close() 而非 Hide()。InputMethod.SetIsInputMethodEnabled 與 TextCompositionManager,機制完全不同。這套組合拳在 WinForms 2.0/3.5/4.x 均經測試有效,解決「看似簡單實則多坑」的輸入法屏蔽問題。