我设计了两个按钮,
OnButton1{ PostMessage(WM_BUTTON1); }
OnButton1{ PostMessage(WM_BUTTON2); }//WM_BUTTON1消息的处理
Sleep(10000); //处理10秒//WM_BUTTON2消息的处理
Sleep(100); //处理0.1秒如果点击button1 十秒钟内点击button2无法响应,非要等WM_BUTTON1的事件处理完才能处理消息WM_BUTTON2我的问题是,能不能通过某种办法,比如把WM_BUTTON2的优先级设高些,使得WM_BUTTON1在阻塞的情况下能先处理WM_BUTTON2。或者还有别的方法?
请各位高手支支招!

解决方案 »

  1.   

    PostMessage 把消息投递到线程的消息对联中,只能是一个一个的取。况且单线程被阻塞后,你也不能执行别的代码
      

  2.   

    楼上两位的意思就是,消息是没有优先级的,你的这个要求不合理
    你只能
    OnButton1{ PostMessage(WM_BUTTON2); }
    OnButton1{ PostMessage(WM_BUTTON1); }我建议你把处理做成线程,任何一个消息在处理的过程中遭遇了阻塞,那么,该窗口将不能处理任何消息,所以,WM_BUTTON1一旦被阻塞,你的所有消息都没用了,一定要等它返回才成.
      

  3.   

    楼上的不对,消息是有优先级的,不同的消息队列中,优先级不一样按照楼主的意思,我不知道这样做合不合适:我们平时用的按钮消息都是用WM_COMMAND发送到窗口的,具体在WM_COMMAND消息中的NotifyCode是BN_CLICKED,说明了所有的按钮按下操作有同样的优先级,因为是一个WM_消息如果lz做的按钮用自定义消息WM_BUTTON1,那么如果想将Button2的优先级设置高一些,可以用SendMessage发送该消息,而用PostMessage发送Button1的消息。如果lz不是用自定义消息的,也可以办到,那就是在你Button1的操作中适当的调用PeekMessage函数,让该操作能接收消息,这样就可以了。
      

  4.   

    是不是每个窗口(包括子窗口)都有自己的消息队列?我把程序改了改
    在主窗口
    OnButton1{ 
     DIALOG1 *pdlg1 = new DIALOG1;
     pdlg1->Create(IDD_DIALOG1);
     pdlg1->ShowWindow(SW_SHOW);
    } //创建子窗口一
    OnButton2{ 方法同上 }  //创建子窗口二在子窗口一
    ::PostMessage(hdlg2,WM_START,0,0) //发一个启动消息给窗口二在子窗口二关联一个消息处理函数
    OnStart(WPARAM wparam,LPARAM lparam)
    {
    处理...
    }调试时我在OnStart里打了断点,发现子窗口一发消息后 窗口二并没有收到,请问是怎么一回事?