zoukankan      html  css  js  c++  java
  • 在WinForm中屏蔽中文输入法

      在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的键位组合的干扰,为了避免这种干扰,故代码上绕了一点圈子,但是有效的。

  • 相关阅读:
    MySQL的复制原理及配置
    MySQL Partition分区扫盲
    SQLite3中自增主键
    SQLite3时间函数小结
    MySQL行级锁,表级锁,页级锁详解
    .vimrc & .bashrc 文件配置
    RecursiveDirectoryIterator目录操作类
    InnoDB外键使用小结
    Validation failed for one or more entities. See 'EntityValidationErrors' property for more details.
    关于友谊的天长地久的方法
  • 原文地址:https://www.cnblogs.com/grenet/p/1706969.html
Copyright © 2011-2022 走看看