這里文章寫出來并不是為了炫耀什么,只是覺得發現些好東西就分享出來而已,同時也做個記錄,方便以后查找
開始正文
1、先介紹本文會用到的windows的API,網上有很詳細的資料,我這里就只簡要說明一下
ImmGetContext(IntPtr hwnd):獲取當前正在輸入的窗口的輸入法句柄
ImmSetOpenStatus(IntPtr himc, bool b):設置輸入法的狀態
InputLanguage類:提供方法和字段以管理輸入語言;這是winform里面自帶的輸入法管理類,msdn上有詳細資料
2、比如本系統安裝有兩個輸入法:搜狗拼音 和 智能 ABC(注意:智能 ABC中間有個空格,用下劃線就是要明確對比出來)。
3、使用InputLanguage類來顯示指定的輸入法。
思路很簡單:先獲取到操作系統中安裝的所有輸入法列表,然后循環列表,比對指定的輸入法名稱(名稱可以設置在配置文件中,安裝的時候,根據不同人的需要配置成不同的輸入法),然后把找到的輸入法設為當前輸入法,代碼如下:
//設置“搜狗拼音”為當前輸入法 foreach (InputLanguage item in InputLanguage.InstalledInputLanguages) { if (item.LayoutName.Contains("搜狗拼音")) { InputLanguage.CurrentInputLanguage = item; break; } } //設置“智能 ABC”為當前輸入法 foreach (InputLanguage item in InputLanguage.InstalledInputLanguages) { if (item.LayoutName.Contains("智能 ABC")) { InputLanguage.CurrentInputLanguage = item; break; } } //設置系統默認輸入法為當前輸入法 InputLanguage.CurrentInputLanguage = InputLanguage.DefaultInputLanguage;
3、解決輸入法被禁用的假象。
思路也很簡單,只需要重新激活輸入法就行了,這里就用到上面的API方法了。
首先聲明一個委托:
private delegate void fixImeDele(); private fixImeDele _fixime;
然后定義委托要實現的事情。
fixime = delegate { IntPtr HIme = ImmGetContext(this.Handle); ImmSetOpenStatus(HIme, true); };
最后執行委托就行了哦。
this.BeginInvoke(fixime);
最后完整代碼如下:
public partial class Form1 : Form { [DllImport("imm32.dll")] public static extern IntPtr ImmGetContext(IntPtr hwnd);//獲取當前正在輸入的窗口的輸入法句柄 [DllImport("imm32.dll")] public static extern bool ImmSetOpenStatus(IntPtr himc, bool b);//設置輸入法的狀態 private delegate void fixImeDele(); private fixImeDele fixime; public Form1() { InitializeComponent(); } private void txt搜狗拼音_Enter(object sender, EventArgs e) { //int index = InputLanguage.InstalledInputLanguages.IndexOf(InputLanguage.CurrentInputLanguage); //設置“搜狗拼音”為當前輸入法 foreach (InputLanguage item in InputLanguage.InstalledInputLanguages) { if (item.LayoutName.Contains("搜狗拼音")) { InputLanguage.CurrentInputLanguage = item; break; } } } private void textBox3_Enter(object sender, EventArgs e) { //設置“智能 ABC”為當前輸入法 foreach (InputLanguage item in InputLanguage.InstalledInputLanguages) { if (item.LayoutName.Contains("智能 ABC")) { InputLanguage.CurrentInputLanguage = item; break; } } } private void txt系統默認_Enter(object sender, EventArgs e) { //設置系統默認輸入法為當前輸入法 InputLanguage.CurrentInputLanguage = InputLanguage.DefaultInputLanguage; } private void txtTrue_Enter(object sender, EventArgs e) { fixime = delegate { IntPtr HIme = ImmGetContext(this.Handle); ImmSetOpenStatus(HIme, true); }; this.BeginInvoke(fixime); } private void txtFalse_Enter(object sender, EventArgs e) { fixime = delegate { IntPtr HIme = ImmGetContext(this.Handle); ImmSetOpenStatus(HIme, false); }; this.BeginInvoke(fixime); } }
再給大家分享一個小問題的解決方法
wihform 默認的 ImeMode 值是NoControl
這不適合中文輸入.
因為例如: 你每到一個控件都要切換一下輸入法.
我們應該把父窗口 及所有子窗口 的 ImeMode 值 設置為 On
可是這樣有個問題就是 它總是全角狀態.
解決辦法是:
在每個窗休的 Desinger.cs文件里找到
this.ImeMode = System.Windows.Forms.ImeMode.On;
替換為
this.ImeMode = System.Windows.Forms.ImeMode.OnHalf;
這樣就ok了.
新聞熱點
疑難解答