winform 實現(xiàn)控制輸入法
這里文章寫出來并不是為了炫耀什么,只是覺得發(fā)現(xiàn)些好東西就分享出來而已,同時也做個記錄,方便以后查找
開始正文
1、先介紹本文會用到的windows的API,網(wǎng)上有很詳細的資料,我這里就只簡要說明一下
ImmGetContext(IntPtr hwnd):獲取當前正在輸入的窗口的輸入法句柄
ImmSetOpenStatus(IntPtr himc, bool b):設置輸入法的狀態(tài)
InputLanguage類:提供方法和字段以管理輸入語言;這是winform里面自帶的輸入法管理類,msdn上有詳細資料
2、比如本系統(tǒng)安裝有兩個輸入法:搜狗拼音 和 智能 ABC(注意:智能 ABC中間有個空格,用下劃線就是要明確對比出來)。
3、使用InputLanguage類來顯示指定的輸入法。
思路很簡單:先獲取到操作系統(tǒng)中安裝的所有輸入法列表,然后循環(huán)列表,比對指定的輸入法名稱(名稱可以設置在配置文件中,安裝的時候,根據(jù)不同人的需要配置成不同的輸入法),然后把找到的輸入法設為當前輸入法,代碼如下:
//設置“搜狗拼音”為當前輸入法 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# Winform下載文件并顯示進度條的實現(xiàn)代碼
- WinForm實現(xiàn)窗體最大化并遮蓋任務欄的方法
- C#中winform控制textbox輸入只能為數(shù)字的方法
- 在Winform動態(tài)啟動、控制臺命令行的方法
- C# WinForm-Timer控件的使用
- C# Winform實現(xiàn)波浪滾動效果
- Winform應用程序如何使用自定義的鼠標圖片
- C# Winform中如何繪制動畫示例詳解
- C# Winform調(diào)用百度接口實現(xiàn)人臉識別教程(附源碼)
- visual studio 2019使用net core3.0創(chuàng)建winform無法使用窗體設計器
- Winform 實現(xiàn)進度條彈窗和任務控制
相關(guān)文章
WPF實現(xiàn)動畫效果(二)之From/To/By動畫
這篇文章介紹了WPF實現(xiàn)動畫效果之From/To/By動畫,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2022-06-06C#中將DataTable轉(zhuǎn)換成CSV文件的方法
DataTable用于在.net項目中,用于緩存數(shù)據(jù),DataTable表示內(nèi)存中數(shù)據(jù)的一個表,在.net項目中運用C#將DataTable轉(zhuǎn)化為CSV文件,接下來通過本文給大家提供一個通用的方法,感興趣的朋友可以參考下2016-10-10解決用Aspose.Words,在word文檔中創(chuàng)建表格的實現(xiàn)方法
本篇文章是對利用Aspose.Words,在word文檔中創(chuàng)建表格的實現(xiàn)方法進行了詳細的分析介紹,需要的朋友參考下2013-05-05C# 用什么方法將BitConverter.ToString產(chǎn)生字符串再轉(zhuǎn)換回去
這篇文章主要介紹了C# 用什么方法將BitConverter.ToString產(chǎn)生字符串再轉(zhuǎn)換回去,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-02-02