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 有效。
代码解决
二.窗体输入法全角/半角解决方案 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
- winform全角半角问题解决汇总
- vs2005 winform 全角/半角问题
- winform输入法全角转换为半角
- Winform输入法全角自动转半角
- 全角半角转换函数 收集&汇总
- 全角半角
- 全角半角
- 全角转半角 半角转全角
- 全角转半角与半角转全角
- 半角转全角、全角转半角
- 全角半角问题
- 全角转换成半角
- 半角、全角转化
- 全角和半角
- 半角全角转换代码
- 全角/半角解决方案
- 什么是全角和半角
- 转全角半角
- 多玩YY,下一个被腾讯打败的对象?
- DirectX简介 第二篇 DirectDraw简介
- 给轮廓画出矩形和圆形边界
- 思考问题的本质--沟通的效率
- thrift, Protocol Buffers and MsgPack 的序列化对比
- winform全角半角问题解决汇总
- Delphi 中,基于接口,封装类为 BPL 包动态加载的程序架构
- 思考问题的本质--有关提炼总结的思维习惯
- Android ListView 之瀑布流设计
- 3.java类特征(Josephus约瑟夫问题)
- 思考问题的本质--如何走出思维困境
- 日本称将据中方巡航船只数量增减钓鱼岛巡逻船-钓鱼岛问题-中日领土争端-中方船只巡航钓鱼岛
- 思考问题的本质--对软件设计中抽象层意义的一点思考
- Ubuntu 允许Root用户登录