比较麻烦,如果那位有解决2005winform程序有输入法半角变全角的bug的高招,我也不用这么辛苦了 网上说的2个解决方法我试验过,没用 1. NDP20-KB925488-X86补丁不是正版用户无法安装的,所以没用。 2.通过继承全角转半角类的方法,也没用。所以我只好自己写个组件。没用的 全角转半角类的定义 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); //转换成半角 } } } }
string ss = "I"; KeysConverter kc=new KeysConverter(); Keys k = (Keys)kc.ConvertFromString(ss); if (k == Keys.I) MessageBox.Show("OK");
Char KeyCode='A';
Keys TheKey = (Keys)Convert.ToInt32(KeyCode);
回车的 把keycode 转换成char
是这样的,因为2005winform程序有输入法半角变全角的bug,所以我就写了个组件,在keydown事件里把全角都转化为半角,因为keydown事件只有keycode,没有keychar,所以我又把keycode转化为string,再把string中的全角替换为半角,但我要让已经替换为半角的字符串生效啊,所以我要把它转回到keydown事件中的keycode,呵呵。
网上说的2个解决方法我试验过,没用
1. NDP20-KB925488-X86补丁不是正版用户无法安装的,所以没用。
2.通过继承全角转半角类的方法,也没用。所以我只好自己写个组件。没用的 全角转半角类的定义
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); //转换成半角
} } }
}
KeysConverter kc=new KeysConverter();
Keys k = (Keys)kc.ConvertFromString(ss);
if (k == Keys.I) MessageBox.Show("OK");