winform全角半角问题解决汇总

来源:互联网 发布:德龄与慈禧知乎 编辑:程序博客网 时间:2024/06/06 03:13

最近开发一个项目,VS2008开发,使用的是.net framework 2.0,因为3.5实在是太大了,在程序运行过程中出现一个问题,当点击任何一个按钮,中文输入法就会由半角变成全角。

这个问题困扰了我很久,后来在网上查了很长时间的资料,终于将这个问题解决了。

问题原因分析:

该全角、半角问题是由于微软.net framework 2.0的bug造成的,微软在2.0sp1,3.5及之后的版本里都解决了该问题,所以解决的办法也比较简单。

解决方案1:

下载.net framework 2.0 sp1补丁,在每一台运行我的程序的电脑上安装即可。

1)下载地址

http://www.microsoft.com/downloads/details.aspx?FamilyID=79bc3b77-e02c-4ad3-aacf-a7633f706ba5&DisplayLang=zh-cn

2)补丁描述:

Microsoft .NET Framework 2.0 Service Pack 1 针对 Microsoft .NET Framework 2.0 发布后客户报告的问题提供了累积的汇总更新。此外,该更新还可帮助改进安全性,且提供了用于 .NET Framework 3.0 Service Pack 1 和 .NET Framework 3.5 的系统必备功能支持。

3)发布方案:

如何将这个补丁打包到发布程序内?将下载的NetFx20SP1_x86.exe更名为dotnetfx.exe,替换 缺省必备组件 安装目录下的同名文件,目录如下:

C:/Program Files/Microsoft Visual Studio 8/SDK/v2.0/BootStrapper/Packages/dotnetfx

然后重新生成软件安装包,就OK了。

解决方案2:(该方法未尝试)

下载全角补丁

1、先下载微软针对这个BUG的补丁 (如果下载地址失效,请搜索“VS2005全角补丁”)
    http://files.cnblogs.com/name-lh/ndp20-kb925488-x86.rar

做到这步,我试过还是一样 看第二步

2、将下面代码加入到Load事件中
this.ImeMode = ImeMode.OnHalf;(只在.net framework 3.5 sp1下有效,在2.0下无效,并且会导致程序无法正常运行)

文本框和窗体的ImeMode属于都不用去设置,如果你之前设置了网上有的说改为On的,你要还原Inherit,但是它会显示NoControl.

这里顺便备注一下ImeMode属性的解释
成员名称 说明 
Alpha 字母数字单字节字符 (SBC)。此设置仅对朝鲜语和日语 IME 有效。 
AlphaFull 字母数字双字节字符。此设置仅对朝鲜语和日语 IME 有效。 
Disable IME 被禁用。如果使用此设置,则用户无法从键盘打开 IME,而且 IME 浮动窗口处于隐藏状态。 
Hangul 朝鲜文 SBC。此设置仅对朝鲜语 IME 有效。 
HangulFull 朝鲜文 DBC。此设置仅对朝鲜语 IME 有效。 
Hiragana 平假名 DBC。此设置仅对日语 IME 有效。 
Inherit 继承父控件的 IME 模式。 
Katakana 片假名 DBC。此设置仅对日语 IME 有效。 
KatakanaHalf 片假名 SBC。此设置仅对日语 IME 有效。 
NoControl 无(默认)。 
Off IME 已关闭。此模式指示 IME 已关闭,这意味着该对象的行为方式与英语输入模式相同。此设置仅对日语、简体中文和繁体中文 IME 有效。 
On IME 已打开。此值指示 IME 已打开,可以输入中文或日语特定的字符。此设置仅对日语、简体中文和繁体中文 IME 有效。

解决方案3:(该方法未尝试)

代码解决

 二.窗体输入法全角/半角解决方案   using   System;     using   System.Collections.Generic;     using   System.ComponentModel;     using   System.Data;     using   System.Drawing;     using   System.Text;     using   System.Windows.Forms;     using   System.Runtime.InteropServices;         namespace   Lqjt     {             public   partial   class   ImeForm   :   Form             {                     public   ImeForm()                     {                             InitializeComponent();                     }                     //声明一些API函数                     [DllImport("imm32.dll")]                     public   static   extern   IntPtr   ImmGetContext(IntPtr   hwnd);                     [DllImport("imm32.dll")]                     public   static   extern   bool   ImmGetOpenStatus(IntPtr   himc);                     [DllImport("imm32.dll")]                     public   static   extern   bool   ImmSetOpenStatus(IntPtr   himc,   bool   b);                     [DllImport("imm32.dll")]                     public   static   extern   bool   ImmGetConversionStatus(IntPtr   himc,   ref   int   lpdw,   ref   int   lpdw2);                     [DllImport("imm32.dll")]                     public   static   extern   int   ImmSimulateHotKey(IntPtr   hwnd,   int   lngHotkey);                     private   const   int   IME_CMODE_FULLSHAPE   =   0x8;                     private   const   int   IME_CHOTKEY_SHAPE_TOGGLE   =   0x11;                     protected   override   void   OnActivated(EventArgs   e)                     {                             base.OnActivated(e);                             IntPtr   HIme   =   ImmGetContext(this.Handle);                             if   (ImmGetOpenStatus(HIme))     //如果输入法处于打开状态                             {                                     int   iMode   =   0;                                     int   iSentence   =   0;                                     bool   bSuccess   =   ImmGetConversionStatus(HIme,   ref   iMode,   ref   iSentence);     //检索输入法信息                                     if   (bSuccess)                                     {                                             if   ((iMode   &   IME_CMODE_FULLSHAPE)   >   0)       //如果是全角                                                     ImmSimulateHotKey(this.Handle,   IME_CHOTKEY_SHAPE_TOGGLE);     //转换成半角                                     }                                 }                     }             }//form     } 



参考资料:

http://blog.csdn.net/gumanren/article/details/4672690

http://www.cnblogs.com/371448009/archive/2009/03/21/1418541.html

http://blog.csdn.net/prince_lintb/article/details/1515063





原创粉丝点击