1:建立单文档SDI 应用程序
2:增加CTestView的WM_CHAR和WM_KEYDOWN的响应
3:void CTestView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) 
{
                         
MessageBox("OnChar!");               // 1               
         int a=1;                             // 2
CView::OnChar(nChar, nRepCnt, nFlags);
}
void CTestView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) 
{                           
`        MessageBox("KeyDown!");             //3
         int b=1;                            //4
CView::OnKeyDown(nChar, nRepCnt, nFlags);
}MSDN上说,WM_CHAR消息在WM_KEYDOWN后,WM_KEYUP前.
按理说一个按键产生后,先执行OnChar(),然后OnKeyDown().可是上述执行顺序为什么是  3 1 2 4.为什么不是 3 4 1 2.??
多谢高手!

解决方案 »

  1.   

    =___= MessageBox又不会阻塞你的消息
      

  2.   

    LZ做了个有趣的试验:)!建议LZ用TRACE(“”)替代MessageBox 和 int ... = 0;然后看输出窗口的顺序。
      

  3.   

    因为你先点了MessageBox("OnChar!");这个弹出来的对话框的确定按钮
    -_-b
      

  4.   

    不对,我错了,应该是MessageBox("OnChar!")是在MessageBox("KeyDown!")里面调用的,所以,一定是MessageBox("OnChar!")返回了,才能继续执行MessageBox("KeyDown!")下面的语句。
    此猜测,建立在认为MessageBox()函数里面有PeekMessage()之类的操作的基础上……
      

  5.   

    MessageBox("OnChar!")是在MessageBox("KeyDown!")里面调用的,所以,一定是MessageBox("OnChar!")返回了,才能继续执行MessageBox("KeyDown!")下面的语句。
    此猜测,建立在认为MessageBox()函数里面有PeekMessage()之类的操作的基础上……
    ..........即使是MessageBox("KeyDown!")返回了,接着也应该执行 //4,然后再执行OnChar().
      

  6.   

    程序运行期间是要处理很多消息的,我们知道MessageBox()并不会阻断消息,比如WM_PAINT重绘之类的消息是肯定会执行的,所以MessageBox()里面应该有
                    if( PeekMessage( &msg, NULL, 0U, 0U, PM_REMOVE ) )
                    {
                        TranslateMessage( &msg );
                        DispatchMessage( &msg );
                    }
    这类的语句。当OnKeyDown执行的时候,MessageBox("KeyDown")先执行,int b=1需要等待MessageBox("KeyDown")返回。由于你未来得及点确定的时候,WM_CHAR消息到达,在MessageBox("KeyDown")执行的内部,被上面的代码处理了这个消息,这个时候MessageBox("KeyDown")必定要等待OnChar()函数执行完毕才能返回。个人见解,自认为很合理……
      

  7.   

    To xabcxabc():你认为我上面猜测的完全没道理吗?
    如果想知道原理只有看代码,现在没有代码,就只能从现象看本质,如果MessageBox()的代码的确是如上猜测的,的确会是你先在遇到的这个效果!
      

  8.   

    先ON_KEYDOWN,如果是字符键,Windows再触发ON_CHAR消息,然后才ON_KEYUP