winform 實現(xiàn)控制輸入法
這里文章寫出來并不是為了炫耀什么,只是覺得發(fā)現(xiàn)些好東西就分享出來而已,同時也做個記錄,方便以后查找
開始正文
1、先介紹本文會用到的windows的API,網上有很詳細的資料,我這里就只簡要說明一下
ImmGetContext(IntPtr hwnd):獲取當前正在輸入的窗口的輸入法句柄
ImmSetOpenStatus(IntPtr himc, bool b):設置輸入法的狀態(tài)
InputLanguage類:提供方法和字段以管理輸入語言;這是winform里面自帶的輸入法管理類,msdn上有詳細資料
2、比如本系統(tǒng)安裝有兩個輸入法:搜狗拼音 和 智能 ABC(注意:智能 ABC中間有個空格,用下劃線就是要明確對比出來)。
3、使用InputLanguage類來顯示指定的輸入法。
思路很簡單:先獲取到操作系統(tǒng)中安裝的所有輸入法列表,然后循環(huán)列表,比對指定的輸入法名稱(名稱可以設置在配置文件中,安裝的時候,根據不同人的需要配置成不同的輸入法),然后把找到的輸入法設為當前輸入法,代碼如下:
//設置“搜狗拼音”為當前輸入法 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; } } //設置系統(tǒng)默認輸入法為當前輸入法 InputLanguage.CurrentInputLanguage = InputLanguage.DefaultInputLanguage;
3、解決輸入法被禁用的假象。
思路也很簡單,只需要重新激活輸入法就行了,這里就用到上面的API方法了。
首先聲明一個委托:
private delegate void fixImeDele(); private fixImeDele _fixime;
然后定義委托要實現(xiàn)的事情。
fixime = delegate { IntPtr HIme = ImmGetContext(this.Handle); ImmSetOpenStatus(HIme, true); };
最后執(zhí)行委托就行了哦。
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);//設置輸入法的狀態(tài) 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系統(tǒng)默認_Enter(object sender, EventArgs e) { //設置系統(tǒng)默認輸入法為當前輸入法 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
可是這樣有個問題就是 它總是全角狀態(tài).
解決辦法是:
在每個窗休的 Desinger.cs文件里找到
this.ImeMode = System.Windows.Forms.ImeMode.On;
替換為
this.ImeMode = System.Windows.Forms.ImeMode.OnHalf;
這樣就ok了.
欄 目:C#教程
本文地址:http://mengdiqiu.com.cn/a1/C_jiaocheng/7023.html
您可能感興趣的文章
- 01-10WinForm限制窗體不能移到屏幕外的方法
- 01-10WinForm繪制圓角的方法
- 01-10C#實現(xiàn)txt定位指定行完整實例
- 01-10WinForm實現(xiàn)仿視頻 器左下角滾動新聞效果的方法
- 01-10C#實現(xiàn)清空回收站的方法
- 01-10C#實現(xiàn)讀取注冊表監(jiān)控當前操作系統(tǒng)已安裝軟件變化的方法
- 01-10C#實現(xiàn)多線程下載文件的方法
- 01-10C#實現(xiàn)Winform中打開網頁頁面的方法
- 01-10C#實現(xiàn)遠程關閉計算機或重啟計算機的方法
- 01-10C#自定義簽名章實現(xiàn)方法


閱讀排行
本欄相關
- 01-10C#通過反射獲取當前工程中所有窗體并
- 01-10關于ASP網頁無法打開的解決方案
- 01-10WinForm限制窗體不能移到屏幕外的方法
- 01-10WinForm繪制圓角的方法
- 01-10C#實現(xiàn)txt定位指定行完整實例
- 01-10WinForm實現(xiàn)仿視頻 器左下角滾動新
- 01-10C#停止線程的方法
- 01-10C#實現(xiàn)清空回收站的方法
- 01-10C#通過重寫Panel改變邊框顏色與寬度的
- 01-10C#實現(xiàn)讀取注冊表監(jiān)控當前操作系統(tǒng)已
隨機閱讀
- 01-11ajax實現(xiàn)頁面的局部加載
- 01-10delphi制作wav文件的方法
- 04-02jquery與jsp,用jquery
- 01-10使用C語言求解撲克牌的順子及n個骰子
- 01-10SublimeText編譯C開發(fā)環(huán)境設置
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 08-05織夢dedecms什么時候用欄目交叉功能?
- 01-10C#中split用法實例總結
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文