国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C# > 正文

winform 實現(xiàn)控制輸入法

2020-01-24 01:30:17
字體:
來源:轉載
供稿:網友

這里文章寫出來并不是為了炫耀什么,只是覺得發(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)列表,比對指定的輸入法名稱(名稱可以設置在配置文件中,安裝的時候,根據(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了.

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 大荔县| 惠东县| 洞口县| 隆回县| 辉县市| 阳山县| 出国| 济阳县| 台南县| 鹤庆县| 乌拉特中旗| 太谷县| 长海县| 偃师市| 香河县| 娄烦县| 谢通门县| 若羌县| 栖霞市| 吕梁市| 永胜县| 寻乌县| 南充市| 平陆县| 辽源市| 麟游县| 邮箱| 筠连县| 连州市| 紫金县| 莒南县| 日照市| 信丰县| 张掖市| 澄迈县| 内乡县| 榆中县| 务川| 泌阳县| 新竹市| 奉贤区|