winform 實(shí)現(xiàn)控制輸入法
這里文章寫(xiě)出來(lái)并不是為了炫耀什么,只是覺(jué)得發(fā)現(xiàn)些好東西就分享出來(lái)而已,同時(shí)也做個(gè)記錄,方便以后查找
開(kāi)始正文
1、先介紹本文會(huì)用到的windows的API,網(wǎng)上有很詳細(xì)的資料,我這里就只簡(jiǎn)要說(shuō)明一下
ImmGetContext(IntPtr hwnd):獲取當(dāng)前正在輸入的窗口的輸入法句柄
ImmSetOpenStatus(IntPtr himc, bool b):設(shè)置輸入法的狀態(tài)
InputLanguage類:提供方法和字段以管理輸入語(yǔ)言;這是winform里面自帶的輸入法管理類,msdn上有詳細(xì)資料
2、比如本系統(tǒng)安裝有兩個(gè)輸入法:搜狗拼音 和 智能 ABC(注意:智能 ABC中間有個(gè)空格,用下劃線就是要明確對(duì)比出來(lái))。
3、使用InputLanguage類來(lái)顯示指定的輸入法。
思路很簡(jiǎn)單:先獲取到操作系統(tǒng)中安裝的所有輸入法列表,然后循環(huán)列表,比對(duì)指定的輸入法名稱(名稱可以設(shè)置在配置文件中,安裝的時(shí)候,根據(jù)不同人的需要配置成不同的輸入法),然后把找到的輸入法設(shè)為當(dāng)前輸入法,代碼如下:
//設(shè)置“搜狗拼音”為當(dāng)前輸入法 foreach (InputLanguage item in InputLanguage.InstalledInputLanguages) { if (item.LayoutName.Contains("搜狗拼音")) { InputLanguage.CurrentInputLanguage = item; break; } } //設(shè)置“智能 ABC”為當(dāng)前輸入法 foreach (InputLanguage item in InputLanguage.InstalledInputLanguages) { if (item.LayoutName.Contains("智能 ABC")) { InputLanguage.CurrentInputLanguage = item; break; } } //設(shè)置系統(tǒng)默認(rèn)輸入法為當(dāng)前輸入法 InputLanguage.CurrentInputLanguage = InputLanguage.DefaultInputLanguage;
3、解決輸入法被禁用的假象。
思路也很簡(jiǎn)單,只需要重新激活輸入法就行了,這里就用到上面的API方法了。
首先聲明一個(gè)委托:
private delegate void fixImeDele(); private fixImeDele _fixime;
然后定義委托要實(shí)現(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);//獲取當(dāng)前正在輸入的窗口的輸入法句柄 [DllImport("imm32.dll")] public static extern bool ImmSetOpenStatus(IntPtr himc, bool b);//設(shè)置輸入法的狀態(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); //設(shè)置“搜狗拼音”為當(dāng)前輸入法 foreach (InputLanguage item in InputLanguage.InstalledInputLanguages) { if (item.LayoutName.Contains("搜狗拼音")) { InputLanguage.CurrentInputLanguage = item; break; } } } private void textBox3_Enter(object sender, EventArgs e) { //設(shè)置“智能 ABC”為當(dāng)前輸入法 foreach (InputLanguage item in InputLanguage.InstalledInputLanguages) { if (item.LayoutName.Contains("智能 ABC")) { InputLanguage.CurrentInputLanguage = item; break; } } } private void txt系統(tǒng)默認(rèn)_Enter(object sender, EventArgs e) { //設(shè)置系統(tǒng)默認(rèn)輸入法為當(dā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); } }
再給大家分享一個(gè)小問(wèn)題的解決方法
wihform 默認(rèn)的 ImeMode 值是NoControl
這不適合中文輸入.
因?yàn)槔? 你每到一個(gè)控件都要切換一下輸入法.
我們應(yīng)該把父窗口 及所有子窗口 的 ImeMode 值 設(shè)置為 On
可是這樣有個(gè)問(wèn)題就是 它總是全角狀態(tài).
解決辦法是:
在每個(gè)窗休的 Desinger.cs文件里找到
this.ImeMode = System.Windows.Forms.ImeMode.On;
替換為
this.ImeMode = System.Windows.Forms.ImeMode.OnHalf;
這樣就ok了.
- C# Winform下載文件并顯示進(jìn)度條的實(shí)現(xiàn)代碼
- WinForm實(shí)現(xiàn)窗體最大化并遮蓋任務(wù)欄的方法
- C#中winform控制textbox輸入只能為數(shù)字的方法
- 在Winform動(dòng)態(tài)啟動(dòng)、控制臺(tái)命令行的方法
- C# WinForm-Timer控件的使用
- C# Winform實(shí)現(xiàn)波浪滾動(dòng)效果
- Winform應(yīng)用程序如何使用自定義的鼠標(biāo)圖片
- C# Winform中如何繪制動(dòng)畫(huà)示例詳解
- C# Winform調(diào)用百度接口實(shí)現(xiàn)人臉識(shí)別教程(附源碼)
- visual studio 2019使用net core3.0創(chuàng)建winform無(wú)法使用窗體設(shè)計(jì)器
- Winform 實(shí)現(xiàn)進(jìn)度條彈窗和任務(wù)控制
相關(guān)文章
c#使用listbox的詳細(xì)方法和常見(jiàn)問(wèn)題解決
這篇文章介紹了c#使用listbox的詳細(xì)方法和常見(jiàn)問(wèn)題解決,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-01-01WPF實(shí)現(xiàn)動(dòng)畫(huà)效果(二)之From/To/By動(dòng)畫(huà)
這篇文章介紹了WPF實(shí)現(xiàn)動(dòng)畫(huà)效果之From/To/By動(dòng)畫(huà),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06C#中將DataTable轉(zhuǎn)換成CSV文件的方法
DataTable用于在.net項(xiàng)目中,用于緩存數(shù)據(jù),DataTable表示內(nèi)存中數(shù)據(jù)的一個(gè)表,在.net項(xiàng)目中運(yùn)用C#將DataTable轉(zhuǎn)化為CSV文件,接下來(lái)通過(guò)本文給大家提供一個(gè)通用的方法,感興趣的朋友可以參考下2016-10-10解決用Aspose.Words,在word文檔中創(chuàng)建表格的實(shí)現(xiàn)方法
本篇文章是對(duì)利用Aspose.Words,在word文檔中創(chuàng)建表格的實(shí)現(xiàn)方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05C# 用什么方法將BitConverter.ToString產(chǎn)生字符串再轉(zhuǎn)換回去
這篇文章主要介紹了C# 用什么方法將BitConverter.ToString產(chǎn)生字符串再轉(zhuǎn)換回去,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-02-02