您的位置:首页 > 其它

多管齐下,解决dotNet FrameWork全角问题

2007-07-21 08:50 423 查看
[align=center]多管齐下,解决dotNet FrameWork全角问题[/align]
[align=center]丽水市汽车运输集团有限公司信息中心苟安廷[/align]
用C#编写winform程序时,输入法经常自动变成全角,给用户的输入带来极的不便,微软至今没有解决这一BUG,网上有较多相关的讨论,但始终不尽人意,本文根据实际工作情况,找到一种较完美的解决方案。
方案一:继承法
首先打开VS2005,新建一个项目,再添加一个Form,取名为ImeForm,因为要用到API函数,故在ImeForm中添加引用:
using System.Runtime.InteropServices;
再声明输入法相关的API函数:
[align=left] #region 声明一些API函数[/align]
[align=left] [DllImport("imm32.dll")][/align]
[align=left] private static extern IntPtr ImmGetContext(IntPtr hwnd);[/align]
[align=left] [DllImport("imm32.dll")][/align]
[align=left] private static extern bool ImmGetOpenStatus(IntPtr himc);[/align]
[align=left] [DllImport("imm32.dll")][/align]
[align=left] private static extern bool ImmSetOpenStatus(IntPtr himc, bool b);[/align]
[align=left] [DllImport("imm32.dll")][/align]
[align=left] private static extern bool ImmGetConversionStatus(IntPtr himc, ref int lpdw, ref int lpdw2);[/align]
[align=left] [DllImport("imm32.dll")][/align]
[align=left] private static extern int ImmSimulateHotKey(IntPtr hwnd, int lngHotkey);[/align]
[align=left] [/align]
[align=left] private const int IME_CMODE_FULLSHAPE = 0x8;[/align]
[align=left] private const int IME_CHOTKEY_SHAPE_TOGGLE = 0x11;[/align]
[align=left] #endregion[/align]
定义一个变量,以保证相关委托只执行一次:
private bool m_FirstStart = true;
将下面的代码复制进去:
[align=left]///<summary>[/align]
[align=left] /// 首次载入窗口时,设置各控件的事件,使其成为半角[/align]
[align=left] ///</summary>[/align]
[align=left] ///<param name="e"></param>[/align]
[align=left] protected override void OnLoad(EventArgs e)[/align]
[align=left] {[/align]
[align=left] base.OnLoad(e);[/align]
[align=left] IntPtr HIme = ImmGetContext(this.Handle);[/align]
[align=left] if (ImmGetOpenStatus(HIme)) //如果输入法处于打开状态[/align]
[align=left] {[/align]
[align=left] int iMode = 0;[/align]
[align=left] int iSentence = 0;[/align]
[align=left] bool bSuccess = ImmGetConversionStatus(HIme, ref iMode, ref iSentence); //检索输入法信息[/align]
[align=left] if (bSuccess)[/align]
[align=left] {[/align]
[align=left] //if ((iMode & IME_CMODE_FULLSHAPE) > 0) //如果是全角[/align]
[align=left] ImmSimulateHotKey(this.Handle, IME_CHOTKEY_SHAPE_TOGGLE); //转换成半角[/align]
[align=left] }[/align]
[align=left] }[/align]
[align=left] if (m_FirstStart)[/align]
[align=left] {[/align]
[align=left] SetFormImeToHangul(this);[/align]
[align=left] m_FirstStart = false;[/align]
[align=left] }[/align]
[align=left] }[/align]
[align=left] private void SetFormImeToHangul(Form p_Form)[/align]
[align=left] {[/align]
[align=left] foreach (System.Windows.Forms.Control ctl in p_Form.Controls)[/align]
[align=left] {[/align]
[align=left] SetControlImeToHangul(ctl);[/align]
[align=left] }[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] ///<summary>[/align]
[align=left] /// 通过递归,遍历当前窗口的全部控件[/align]
[align=left] ///</summary>[/align]
[align=left] ///<param name="p_Control">容器</param>[/align]
[align=left] private void SetControlImeToHangul(System.Windows.Forms.Control p_Control)[/align]
[align=left] {[/align]
[align=left] if (p_Control.HasChildren)[/align]
[align=left] {[/align]
[align=left] foreach(Control ctl in p_Control.Controls)[/align]
[align=left] SetControlImeToHangul(ctl); [/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] p_Control.KeyDown+=new KeyEventHandler(p_Control_KeyDown);[/align]
[align=left] p_Control.KeyPress+=new KeyPressEventHandler(p_Control_KeyPress);[/align]
[align=left] p_Control.Enter+=new EventHandler(p_Control_Enter);[/align]
[align=left] }[/align]
[align=left] private void p_Control_KeyDown(object sender, KeyEventArgs e)[/align]
[align=left] {[/align]
[align=left] (sender as Control).ImeMode = ImeMode.Hangul;[/align]
[align=left] }[/align]
[align=left] private void p_Control_KeyPress(object sender, KeyPressEventArgs e)[/align]
[align=left] {[/align]
[align=left] //防止其他情况可能出现的全角[/align]
[align=left] int nIndex = "0123456789。.".IndexOf(e.KeyChar);[/align]
[align=left] if (nIndex > -1)[/align]
[align=left] e.KeyChar = "0123456789.."[nIndex];[/align]
[align=left] }[/align]
[align=left] private void p_Control_Enter(object sender, EventArgs e)[/align]
[align=left] {[/align]
[align=left] (sender as Control).ImeMode = ImeMode.Hangul;[/align]
}
最后,将其他所有窗口的基本类有默认的System.Windows.Foms.Form改为上面的ImeForm,再运行一下程序,是不是全角问题解决了?
方案二:类方法
如果已有项目,要修改基类可能会出现问题,故你将方案一的方法写到一个类里面去,在Load事件中调用SetFormImeToHangul(this);就可以了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: