为什么输入法状态自动变成全角?
做了一个很简单的winform程序,其中的文本框输入汉字时如果当时使用的是半角状态,在没有关闭输入法的情况下关闭该子窗体,等再次打开该子窗体时输入法变成全角状态了 问题点数:20、回复次数:14Top
1 楼hle(老大)回复于 2006-04-17 14:09:54 得分 0
vs2005都有这个问题。
把窗体的ImeMode设为'On'即可,偶尔会在第一次切换窗口时出现问题,可能和系统环境有关,手工切换一次后就好了Top
2 楼superzxf(superzxf)回复于 2006-04-20 16:12:54 得分 0
郁闷极了,操作很不方便,vs2005都这样啊,ms有没出什么补丁呀Top
3 楼zhoujijunnt(---)回复于 2006-04-20 16:29:33 得分 0
05的bug,建议到MS的网站上提点意见去Top
4 楼superzxf(superzxf)回复于 2006-04-21 12:29:01 得分 0
郁闷至极,简直骑虎难下啊Top
5 楼moguiziziwenlong(C#学习中,各位帮忙帮忙帮帮忙~~ >_<)回复于 2006-04-21 12:46:24 得分 0
我还用了 2005 没发现过~Top
6 楼diandian82(点点(nothing))回复于 2006-04-21 12:49:53 得分 0
好像英文版没问题吧?Top
7 楼Lucky527(幸运星)回复于 2006-04-21 15:54:24 得分 0
其实这和你的程序无关,和你系统有关,我做过实验,就是到系统的输入法设置中去改变一下默认的输入法(以前为智能ABC)为(简体中文)美式键盘,之后每次再打开这个窗体时就是半角了。
总之是你windows系统的输入法设置默认是什么的问题。Top
8 楼xrwang(无涯)回复于 2006-04-21 16:02:47 得分 5
我已经在多台电脑试过了,楼上的说法是错误的。Top
9 楼runrunrun(农妇、山泉、有点田)回复于 2006-04-25 17:37:04 得分 5
我也遇到这个问题了。textbox还好了,但只要一打开Datetimepicker,输入法就会变成全角的Top
10 楼anson2003(老蒋)回复于 2006-04-25 17:57:56 得分 5
我遇到了一样得问题!Top
11 楼superzxf(superzxf)回复于 2006-04-27 14:01:41 得分 0
这个问题烦死了,怎么没有补丁啊Top
12 楼liujiwe79(专业做控件)回复于 2006-04-27 14:09:20 得分 5
靠,手工切换累死了,我也遇到过这个问题Top
13 楼gatr()回复于 2006-05-08 09:49:40 得分 0
这是一个微软的一个大BUG,目前无好的解决办法,我通过如下办法处理:
1、新建一个类:ImeForm,该类继承于Form,
2、在Load事件中,通过递归循环,查找所有的文本框,处理文本框的Enter事件,自动将输入法转换为半角,当然,如果其他输入控件也有类似问题,无非是在递归循环中多一个判断分支而已.
3、将程序中用到的Form的基类由System.Windows.Forms.Form改为ImeForm,如果以后微软解决了这个问题,改回去就可以了,ImeForm的全部代码如下:
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
namespace Lqjt
{
/// <summary>
/// 解决输入法全角的问题
/// </summary>
public class ImeForm : System.Windows.Forms.Form
{
/// <summary>
/// 做一个标记,避免重复设置Enter事件
/// </summary>
private bool m_AttachProcessed = false;
/// <summary>
/// 在Load事件中遍历控件,如果是文本框,自动切换到半角状态
/// </summary>
/// <param name="e"></param>
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
if (!m_AttachProcessed)
{
SetImeToHangul(this.Controls);
m_AttachProcessed = true;
}
}
/// <summary>
/// 通过递归,遍历当前窗口的全部控件
/// </summary>
/// <param name="p_Controls">容器</param>
private void SetImeToHangul(System.Windows.Forms.Control.ControlCollection p_Controls)
{
foreach (System.Windows.Forms.Control ctl in p_Controls)
{
FlowLayoutPanel flpan = ctl as FlowLayoutPanel;
if (flpan != null)
{
SetImeToHangul(flpan.Controls);
continue;
}
GroupBox grp = ctl as GroupBox;
if (grp != null)
{
SetImeToHangul(grp.Controls);
continue;
}
Panel pan= ctl as Panel;
if (pan != null)
{
SetImeToHangul(pan.Controls);
continue;
}
TabControl tabcontrol = ctl as TabControl;
if (tabcontrol != null)
{
SetImeToHangul(tabcontrol.Controls);
continue;
}
TabPage tabpage = ctl as TabPage;
if (tabpage != null)
{
SetImeToHangul(tabpage.Controls);
continue;
}
TableLayoutPanel tlpan = ctl as TableLayoutPanel;
if(tlpan!=null)
{
SetImeToHangul(tlpan.Controls);
continue;
}
//文本框进入时,自动切换到半角,如果要控制其他可输入控件,参照下面的代码完成
TextBox txtbox = ctl as TextBox;
if (txtbox != null)
{
txtbox.Enter += new EventHandler(ControlEnter_Enter);
}
}
}
private void ControlEnter_Enter(object sender, EventArgs e)
{
Control ctl = sender as Control;
if (ctl == null)
return;
if (ctl.ImeMode != ImeMode.Hangul)
ctl.ImeMode = ImeMode.Hangul;
}
}//class
}
Top
14 楼gatr()回复于 2006-07-01 08:21:38 得分 0
根据网上内容,我又重新修改了ImeForm,修改后的效果更好,解决了在NumbericUpDown以及用户通过Ctrl+Shift切换不能变半角的问题,新的如下:
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
}Top




