中文输入时候多次触发KeyPress事件

o1n 2006-12-26 04:26:14
问题描述:
1我做了一个类似下拉框的控件,包括文本框和下拉的一个大的文本输入区域
2要实现当文本框检测到有录入时候,就自动弹出下拉框,并且把录入的字符自动录入到下拉的文本录入区域
3问题是:现在我输入英文,例如我输入“a”,自动下拉框就打开了,下拉的文本输入区域获取字符“a”,并且光标在“a”之后。如果我在文本框连续的录入“abcdef”,下拉框也自动打开,并且获取字符“abcdef”,光标在f之后。但是,如果我用中文输入法,我在文本框录入“中国”,按空格确认选择,则在下拉的区域获取的字符是“中国国”,光标在最后的“国”之后,如果我输入“中”,则下拉区域获取的是“中中”
4 我现在用的是C#,输入法紫光和智能ABC,另外,紫光录入“中国”,如果用小键盘区的数字键选择,则下拉文本区获取对应的数字,无法获取中文,

private void cddcMain_KeyPress(object sender, System.Windows.Forms.KeyPressEventArgs e)
{
if(e.KeyChar != 27)
{
e.Handled = true;
this.cddcMain.Value = "";
this.cddcMain.OpenDropDown();

string strText = "";
if(e.KeyChar != 8)//Back键
{
if(e.KeyChar == 13) //回车
strText = "";
else
strText = e.KeyChar.ToString();
}
this.frmTextEdit.TSTextMain.Focus();
this.frmTextEdit.TSTextMain.AppendText(strText);
this.frmTextEdit.TSTextMain.SelectAll();
this.frmTextEdit.TSTextMain.SelectionStart = this.frmTextEdit.TSTextMain.SelectionLength;
}
}


...全文
1185 14 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
o1n 2007-01-07
  • 打赏
  • 举报
回复
不知道问题解决了没?
一直学习 2006-12-30
  • 打赏
  • 举报
回复
UP
liujia_0421 2006-12-29
  • 打赏
  • 举报
回复
某些输入法在输入输入汉字的时候,其按键事件是在输入法中,而不是在控件上
juge001 2006-12-29
  • 打赏
  • 举报
回复
补充一下:这里只能捕捉某些输入法的字符,如微软拼音等.英文方面的还得用keypress

protected override void OnKeyPress(System.Windows.Forms.KeyPressEventArgs e)
{
else if((int)e.KeyChar != 8)
{
this.InsertText(e.KeyChar.ToString());
e.Handled = true;
}
base.OnKeyPress (e);
}
juge001 2006-12-29
  • 打赏
  • 举报
回复
妈的,搞了好几天,终于把他给搞出来了。
原因是在api里,如果有输入法的情况下,每写一个字就会提交一个信息,当写完字又会触发他的keyPress事件的,所以这么处理一下就可了。

private const int WM_IME_CHAR = 0x0286; //input char
protected override void WndProc(ref System.Windows.Forms.Message m)
{

else if(m.Msg == WM_IME_CHAR)
{
int var = m.WParam.ToInt32();
char ch = Convert.ToChar(var);

this.InsertText(ch.ToString());
return; //return了kepress就不会处理了。我们用自己写的函数给他加上去,那么就只加一次了
}
base.WndProc (ref m);
}
}


juge001 2006-12-28
  • 打赏
  • 举报
回复
哎。试来试去还是不行,继续等待高手
o1n 2006-12-28
  • 打赏
  • 举报
回复
sqfeiyu(流星雨) 兄弟,你说的我看的不大明白啊。
o1n 2006-12-28
  • 打赏
  • 举报
回复
TextChange的时候变成“中中国”了,我用KeyDown处理,对于输入中文可以了,但是英文又不可以。好像输入中文的时候,输入法选择框就像是一个窗体一样啊,反正我也说不清楚怎么回事现在。
juge001 2006-12-27
  • 打赏
  • 举报
回复
UP等待高手
llyzcy 2006-12-26
  • 打赏
  • 举报
回复
up
JavaK 2006-12-26
  • 打赏
  • 举报
回复
不要用KeyPress Event,用TextChange事件吧!
kagad 2006-12-26
  • 打赏
  • 举报
回复
重复添加了
sqfeiyu 2006-12-26
  • 打赏
  • 举报
回复
每交Text的值改變后﹐保存到一個臨時變量中(在TextChange事件中處理)
因為每次的KeyPress不一定會改變Text的內容﹐所以在KeyPress事件中作個判斷﹐是否要提交Text的內容至下拉框中就可以了。將判斷的結果保存在一個變量中,主要是防止刪除或按回車后造成的TextChange事件。其它的就在TextChange事件中添加到下拉框中,添加的內容就是現在的Text內容減去保存的之前的Text內容. (最麻煩的是插入動作﹐需要在下拉框中先從后面刪除之前的內容﹐再加上現在的Text內容)
sqfeiyu 2006-12-26
  • 打赏
  • 举报
回复
判斷一下Text的值是否改變就可以了啊~~
如果Text改變則添加否則不處理

111,098

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧