本来是先keydown,再keypress的。如果两个事件里面同时有一个MessageBox.Show()就会变成先keypress,后keydown。为什么会这样?

解决方案 »

  1.   

    所以顺序 PRESS  ,DOWN,UP
      

  2.   

    keydown         按下键盘某键时触发   
    keypress       按下某个字符键(ASCII码)时触发 
    KeyPress与KeyDown关心的是不同的内容。   
    在KeyPress中关心的是输入了什么内容,而KeyDown关心按下了什么键。
    所有按下不同的键,弹出的MessageBox先后顺序就会不一样!
      

  3.   

    楼上说的有理,如果可以测试一下,如果按键盘上的F1-F12功能键,那么先弹出Down,按A-Z先弹出Press,测试了一部分。
    顺序会不一样的。
      

  4.   

    F1根本就不会触发keydown呀。------------------------------keydown和press两个事件里面,都有一句MessageBox.Show(),他们的触发顺序就会变化~
    注意,使这两个事件‘触发顺序’变化的,并不是所按下的键~
    而是事件处理程序里面,是否同时具有MessageBox.Show()。为什么?
      

  5.   

    Fan52027先弹出down,后面就不会再弹出press了吧?如果先弹出press,后面还是会弹出down。这说明F1根本不会触发press,那就谈不上使他们的顺序发生变化呀------------------------------------------------------------hqpy(LittleDog) 如果两个事件里面,不是同时有messageBox.Show(),
    就算我按下了字母a,那还是正常,keydown先执行。
      

  6.   

    keydown         按下键盘某键时触发   
    keypress       按下某个字符键(ASCII码)时触发 
    KeyPress与KeyDown关心的是不同的内容。   
    在KeyPress中关心的是输入了什么内容,而KeyDown关心按下了什么键。
    所有按下不同的键,弹出的MessageBox先后顺序就会不一样!
    正解
      

  7.   

    那为什么我按下a键,还是会先触发keydown?
    假如事件里面没有同时具有MessageBox.Show()大家怎么都不看完就说了~!!
      

  8.   

    举个例子,阿里打拳击,打一个下勾拳,我们会惊叫:“阿里打组合拳了。”因为一套组合拳是由上勾拳和下勾拳组合而成的。keypress就是类似这样的原理,在keydown发生前就已经触发了这个事件,而发生之后接着就是keydown,再后面是keyup,并不会在keyup后再去触发一下keypress事件。
      

  9.   

    没一个认真看贴回答的.答案也多是COPY来的.不止楼主郁闷,我也郁闷.
      

  10.   

    alldj那为什么有时候会先触发keydown?有时候又会先触发keypress?而且与你所按的键无关!--------------------------------------------------MSDN的给我们说明是:KeyDown会在KeyPress之前触发~而事实,某些时候,这个触发顺序会发生变化,
    糟糕之处在于,对于这种变化,程序员一无所知。强调:‘这个变化和我们所按的键无关’。-------------------------------------请细看回复~我并不是说这是个怎么了不起的问题我只是为这个问题的潜在威胁担忧,来这里寻求一些解答有时候,一台计算机出了问题,不就是因为一只小虫子吗?
      

  11.   

    在这样的事件里不要用MessageBox来显示信息,这样会使控件的焦点失去而变得处理不正常.
      

  12.   

    关键在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事件的方法应该也都是这样。
      

  13.   

    hbxtlhx可以详细一点吗?为什么失去焦点会导致异常?------------------------------------------danjiewu你这个解释是目前最合乎逻辑的了。------------------------------------------各位还有别的看法吗?