日期:2014-05-19  浏览次数:21007 次

c# 文本框的keypress和keydown事件,发生的顺序为什么会颠倒的?
本来是先keydown,再keypress的。

如果两个事件里面同时有一个MessageBox.Show()

就会变成先keypress,后keydown。

为什么会这样?

------解决方案--------------------
不PRESS怎么DOWN
------解决方案--------------------
所以顺序 PRESS ,DOWN,UP
------解决方案--------------------
是这样的吧.

------解决方案--------------------
查下这两个词的意思就晓得了
------解决方案--------------------
keydown 按下键盘某键时触发
keypress 按下某个字符键(ASCII码)时触发
KeyPress与KeyDown关心的是不同的内容。
在KeyPress中关心的是输入了什么内容,而KeyDown关心按下了什么键。
所有按下不同的键,弹出的MessageBox先后顺序就会不一样!
------解决方案--------------------
楼上说的有理,如果可以测试一下,如果按键盘上的F1-F12功能键,那么先弹出Down,按A-Z先弹出Press,测试了一部分。
顺序会不一样的。
------解决方案--------------------
不要钻牛角尖了,这种问题没什么很值得研究的必要,两个事件的功能不同,所要捕捉的东西也不同。
------解决方案--------------------
keydown 按下键盘某键时触发
keypress 按下某个字符键(ASCII码)时触发
KeyPress与KeyDown关心的是不同的内容。
在KeyPress中关心的是输入了什么内容,而KeyDown关心按下了什么键。
所有按下不同的键,弹出的MessageBox先后顺序就会不一样!
正解
------解决方案--------------------
举个例子,阿里打拳击,打一个下勾拳,我们会惊叫:“阿里打组合拳了。”因为一套组合拳是由上勾拳和下勾拳组合而成的。keypress就是类似这样的原理,在keydown发生前就已经触发了这个事件,而发生之后接着就是keydown,再后面是keyup,并不会在keyup后再去触发一下keypress事件。
------解决方案--------------------
没一个认真看贴回答的.答案也多是COPY来的.不止楼主郁闷,我也郁闷.
------解决方案--------------------
在这样的事件里不要用MessageBox来显示信息,这样会使控件的焦点失去而变得处理不正常.
------解决方案--------------------
关键在keypress触发的时机。
一个按键动作结束时才会触发keypress事件,正常情况下是在keydown事件之后。
但是MessageBox.Show会触发一个windows事件,系统会认为这时按键动作已经结束,因此“提前”触发了keypress事件。最后的结果就是在keydown事件中触发了keypress事件。
private void Form1_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
{
this.textBox1.Text += "KeyDown before message box!\r\n ";
MessageBox.Show( "KeyDown! ");
this.textBox1.Text += "KeyDown after message box!\r\n ";
}

private void Form1_KeyPress(object sender, System.Windows.Forms.KeyPressEventArgs e)
{
this.textBox1.Text += "KeyPress before message box!\r\n ";
MessageBox.Show( "KeyPress! ");
this.textBox1.Text += "KeyPress after message box!\r\n ";
}
运行一下这个代码就很清楚了。

在keydown中调用其它触发windows事件的方法应该也都是这样。