在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的鍵位組合的干擾,為了避免這種干擾,故代碼上繞了一點圈子,但是有效的。