程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> winform 完成掌握輸出法

winform 完成掌握輸出法

編輯:C#入門知識

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了.

  1. 上一頁:
  2. 下一頁: