程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> Visual Basic語言 >> VB綜合教程 >> 如何在WinForm中屏蔽中文輸入法

如何在WinForm中屏蔽中文輸入法

編輯:VB綜合教程
 

在WinForm的開發中,有時有些特殊的要求。例如:在某個Form上徹底屏蔽中文輸入法,使之不能切換到中文輸入,不能進行中文輸入。

  這個問題看上去簡單,實現起來並沒有想象中的簡單。下面,把我做的幾個實驗依次列舉,就會發現,其實實現起來還是有一定難度的。

  實驗一:

    1、新建項目,建立兩個Form,分別為Form1、Form2。Form1為啟動Form。

    2、Form1上有一個TextBox和Button。

        點擊Button,執行下面語句

          Me.Hide()

          Form2.Show()

    3、Form2上有一個TextBox,TextBox的ImeMode屬性設為close,意思為關閉輸入法模式。

        在Form2的FormClosed事件中執行下面語句。

          Form1.Show()

  好,現在來測試這個實驗。嗯,很不幸,在Form2中TextBox中很順利的切換了中文輸入法,輸入了中文。試驗失敗。



  實驗二:

    繼續實驗一,找了相關的資料,發現有一個InputLanguageChanging事件,似乎可以控制輸入法的切換。

    4、在Form2的TextBox的InputLanguageChanging事件中添加如下代碼

      e.Cancel = True

  來測試一下。貌似試驗成功了,按照實驗一的測試,在Form2中TextBox已經不能切換輸入法了。

  為何是貌似呢?我們再重新測試一番,就有問題了。

  先在Form1中的TextBox中切換成中文輸入法。然後點擊Button,切換到Form2,你再Ctrl+Space,發現在Form2中的TextBox裡出現了熟悉的中文輸入法。呵呵,實驗二不能算成功的。



  分析實驗二為何不能成功。我想關鍵就是在切換到Form2之前,我就已經切換成中文輸入法。那如果在切換Form2之前就把輸入法釘死在系統的默認輸入法如何?

  實驗三:

  1、先在Form1中添加如下代碼

    Private Sub SetDefaultInputLanguage()

      InputLanguage.CurrentInputLanguage = InputLanguage.DefaultInputLanguage

    End Sub

  2、點擊Form1的Button,執行下面語句

    Call SetDefaultInputLanguage()

    Me.Hide()

    Form2.Show()

  嗯,測試一下,這次成功了。就算能用鼠標在Form2中TextBox更改輸入法,可是TextBox中仍然只能用英文輸入。



  把上面的三個實驗總結一下。要想在WinForm中屏蔽輸入法。三個要素:

  1、TextBox的ImeMode為Close

  2、在TextBox的InputLanguageChanging事件中添加e.Cancel = True

  3、在切換到當前Form之前要切換到默認輸入法

    InputLanguage.CurrentInputLanguage = InputLanguage.DefaultInputLanguage



  備注:

  這次三個實驗比較順利。之前在做實驗的時候還碰到奇怪的地方,導致試驗失敗,後來想想,可能是微軟輸入法的原因,這次實驗時用的是微軟2007輸入法,之前的實驗用的是微軟2003輸入法。

  我把之前實驗奇怪的地方也書寫下來,並給出解決的方法。和各位網友交流。

  1、如果內存中有兩個Form的實例,實驗不會成功。

    解決辦法是:將Me.Hide改為Me.Close。在內存中只保留一個Form    

  2、如果系統有微軟2003輸入法,並且在Form1中的TextBox就切換成微軟輸入法,實驗也不會成功。

    解決辦法是:先切換為第一個不是微軟輸入法的中文輸入法,再切換為默認輸入法。代碼如下:

    Private Sub SetDefaultInputLanguage()

      Dim i As Integer, j As Integer

      j = 0

      For i = 1 To InputLanguage.InstalledInputLanguages.Count - 1

        If InputLanguage.InstalledInputLanguages(i).LayoutName.IndexOf("微軟") < 0 Then

          j = i

          Exit For

        End If

      Next

      InputLanguage.CurrentInputLanguage = InputLanguage.InstalledInputLanguages(j)

      InputLanguage.CurrentInputLanguage = InputLanguage.DefaultInputLanguage

    End Sub

  

  為何是這樣,我不知道,我是碰到這個情況,並反復試驗才得出的解決方案。



  附記:

  有網友說設置TextBox的ImeMode屬性為Disabled也能達到同樣的效果。在此感謝各位指正的網友。

  為何當初花了那麼多時間研究,卻走了彎路?仔細回憶了一番,原來當初的要求不一樣。

  當初的要求是屏蔽TextBox的中文輸入法,還要能捕捉到TextBox的Ctrl+Space的鍵位組合。而ImeMode屬性為Disabled時,TextBox是捕捉不到Ctrl+Space的鍵位組合,因為TextBox控件是自動過濾了該鍵位組合。而上面備注裡說的情況,就是微軟輸入法對Ctrl+Space的鍵位組合的干擾,為了避免這種干擾,故代碼上繞了一點圈子,但是有效的。

 
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved