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


    本文转自万仓一黍博客园博客,原文链接:http://www.cnblogs.com/grenet/archive/2010/04/08/1706969.html,如需转载请自行联系原作者

相关文章
|
存储 关系型数据库 MySQL
【MySQL专题】MySQL百万级数据插入效率优化
【MySQL专题】MySQL百万级数据插入效率优化
1261 0
【MySQL专题】MySQL百万级数据插入效率优化
|
Windows
windows 技巧篇-解除共享文件夹占用方法,解决共享文件被占用导致不可修改问题,查看共享文件被谁占用方法
windows 技巧篇-解除共享文件夹占用方法,解决共享文件被占用导致不可修改问题,查看共享文件被谁占用方法
2425 0
windows 技巧篇-解除共享文件夹占用方法,解决共享文件被占用导致不可修改问题,查看共享文件被谁占用方法
|
机器学习/深度学习 移动开发 TensorFlow
深度学习之格式转换笔记(四):Keras(.h5)模型转化为TensorFlow(.pb)模型
本文介绍了如何使用Python脚本将Keras模型转换为TensorFlow的.pb格式模型,包括加载模型、重命名输出节点和量化等步骤,以便在TensorFlow中进行部署和推理。
466 0
|
SQL 数据采集 数据处理
如何在 SQL Server 中使用 LEN 函数
【8月更文挑战第9天】
589 1
如何在 SQL Server 中使用 LEN 函数
|
JavaScript 前端开发 API
javaScript中常用的String方法以及注意点总结
本文总结了JavaScript中常用的String对象的方法及其注意事项,包括大小写转换、字符获取、子字符串截取、字符串拼接、去除空格、替换、分割以及查找字符串中字符的索引等操作。提供了每种方法的使用示例代码,帮助理解它们的具体用法和差异。
223 2
|
C# 数据安全/隐私保护 计算机视觉
C#开发者的新选择:使用ImageSharp进行图像处理
C#开发者的新选择:使用ImageSharp进行图像处理
1582 8
|
C# 开发者 Windows
WPF遇上Office:一场关于Word与Excel自动化操作的技术盛宴,从环境搭建到代码实战,看WPF如何玩转文档处理的那些事儿
【8月更文挑战第31天】Windows Presentation Foundation (WPF) 是 .NET Framework 的重要组件,以其强大的图形界面和灵活的数据绑定功能著称。本文通过具体示例代码,介绍如何在 WPF 应用中实现 Word 和 Excel 文档的自动化操作,包括文档的读取、编辑和保存等。首先创建 WPF 项目并设计用户界面,然后在 `MainWindow.xaml.cs` 中编写逻辑代码,利用 `Microsoft.Office.Interop` 命名空间实现 Office 文档的自动化处理。文章还提供了注意事项,帮助开发者避免常见问题。
973 0
|
API C# 开发者
WPF图形绘制大师指南:GDI+与Direct2D完美融合,带你玩转高性能图形处理秘籍!
【8月更文挑战第31天】GDI+与Direct2D的结合为WPF图形绘制提供了强大的工具集。通过合理地使用这两种技术,开发者可以创造出性能优异且视觉效果丰富的WPF应用程序。在实际应用中,开发者应根据项目需求和技术背景,权衡利弊,选择最合适的技术方案。
972 1
|
SQL 存储 关系型数据库
SQL中日期格式处理方法大全
整理所有的SQL中日期格式处理方法大全
|
设计模式 编解码 程序员
探索 C++ 20 (co_await、co_yield 和 co_return)协程基本框架的使用
探索 C++ 20 (co_await、co_yield 和 co_return)协程基本框架的使用
1883 2
探索 C++ 20 (co_await、co_yield 和 co_return)协程基本框架的使用