winform 完成掌握輸出法。本站提示廣大學習愛好者:(winform 完成掌握輸出法)文章只能為提供參考,不一定能成為您想要的結果。以下是winform 完成掌握輸出法正文
這裡文章寫出來其實不是為了誇耀甚麼,只是認為發明些好器械就分享出來罷了,同時也做個記載,便利今後查找
開端注釋
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了.