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);
        }
    }
View Code

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM