为什么在WM_TIMER中的MessageBox会不停的出现
MessageBox不是要等到关闭了才会返回吗
似乎MessageBox会调用WndProc
请大侠帮我详细介绍一下WM_TIMER

解决方案 »

  1.   

    那是因为你在WM_TIMER调用了MessageBox,所以不停的出现
      

  2.   

    就是这个问题,每次Timer事件都出发messagebox消息,所以就不停的出现
      

  3.   

    WM_TIMER是定时器消息。系统定时会响应,自然就会有多个MessageBox消息窗了。它可不管你当前有没有MessageBox显示着
      

  4.   

    WM_TIMER
    The WM_TIMER message is posted to the installing thread's message queue when a timer expires. The message is posted by the GetMessage or PeekMessage function. A window receives this message through its WindowProc function. WM_TIMER属于那种不进入消息队列,由操作系统直接调用窗口过程(在窗口建立时注册)进行处理的消息.只要时间到,就会执行相关代码.建议在MessageBox前调用KillTimer,返回后重新设定定义器.
      

  5.   

    WM_TIMER与一般的循环语句不同,只要时间到了,就会执行你的语句,而一般的循环,比如:for, while等,这些循环是需要等到关闭掉MessageBox后才会返回的
      

  6.   

    MessageBox运行未返回时,这时候并没有阻塞当前主线程,
    而是使用了一个循环,不断的去处理队列里面的消息。这时候,
      WM_TIMER消息仍然
                  会被再次处理....
      

  7.   

    同意(哈欠)所述,没有阻塞当前主线程
    用线程解释狠明白!WM_TIMER
    The WM_TIMER message is posted to the installing thread's message queue when a timer expires. The message is posted by the GetMessage or PeekMessage function. 
    A window receives this message through its WindowProc function. 
    再加上(李群康)的英文文献,学到很多!
      

  8.   

    WM_TIMER属于那种不进入消息队列,由操作系统直接调用窗口过程(在窗口建立时注册)进行处理的消息.只要时间到,就会执行相关代码.建议在MessageBox前调用KillTimer,返回后重新设定定义器.=================
    我不同意.
    这个消息是进消息队列的!!你上面列出的英文参考里说得很清楚"The WM_TIMER message is posted to the installing thread's message queue" halfdream(哈欠)说的应该是正解.messageBox内部有一个循环会处理当前线程的消息队列.
      

  9.   

    同意楼上的。
    而且消息是被POST到程序的,而不是SEND。
      

  10.   

    WM_TIMER消息是无须等待执行完毕的,也就是POST消息啦。
    而你的MessageBox函数需要你点击确定后才能执行完毕,你把这个函数放到了WM_TIMER消息中,那么就是说你的每个WM_TIMER消息的响应函数都没有执行完,因为你都没有点击MessageBox的确定,那么就无限的WM_TIMER下去了……
      

  11.   

    to  QunKangLi(李群康) ,WM_TIMER是如队列的! GetMessage和PeekMessage从队列中得到WM_TIMER,并用DispatchMessage通过user32模块调用窗口过程。如果MessageBox第一个指定NULL,应该是每个WM_TIMER就弹出一个对话框,如果指定窗口句柄,应该就弹出一个.我试试。
      

  12.   

    如果MessageBox第一个指定NULL,应该是每个WM_TIMER就弹出一个对话框,如果指定窗口句柄,应该就弹出一个.我试试。//试了,不行。原因可能是弹出的对话框没有消息循环,只有窗口过程。主窗口的消息循环依然在工作。和mfc的模式对话框不一样。
      

  13.   

    MessageBox运行未返回时,这时候并没有阻塞当前主线程,
    而是使用了一个循环,不断的去处理队列里面的消息。这时候,
      WM_TIMER消息仍然
                  会被再次处理....
    =====================================================
    我认为应该是这样的,因为任何弹出MessageBox的窗口会重绘,不会因为MessageBox遮挡,而显示有问题。
    而且,从调试的堆栈来看,MessageBox调用后,后一个被调用的就是WndProc
    不过不知道msdn上市怎么写的
      

  14.   

    WM_TIMER 不会里你哪么多, 只要到时间它就做一次。
      

  15.   

    ra3(可乐)
    是吗?
    你倒试试SetTimer(间隔设为500ms),然后在onTimer中sleep(5000)后执行一个函数,看是不是时间一到他就做.
      

  16.   

    To IFoo(我不是色盲,但我的世界却是黑白的):
    "SetTimer(间隔设为500ms),然后在onTimer中sleep(5000)后执行一个函数..."这个函数会每隔5500ms执行一次
      

  17.   

    To: lmtz007yan(忽隐忽现)Sleep()是挂起主线程!所以你这样是正常的;-------------
    WM_TIMER消息是入队列的,但此消息较特殊,"The WM_TIMER message is posted to the installing thread's message queue",主thread会定时 POST WM_TIMER 消息到窗口,因为POST不等待,所以可以不停弹出。测试一下:
    1、建立窗口,响应WM_TIMER消息,但不在程序中调用SetTimer注册消息!
    2、模拟主thread定时POST消息。建立线程,定时POST:extern HWND hWnd;// 主窗口句柄(处理WM_TIMER消息)
    int timer_id = 123;// 注册timer ID
    int delay = 100;// 定时时间,msDWORD PostThread(PVOID pParam)
    {
       while (true)
       {
          PostMessage(hWnd, WM_TIMER, WPARAM (timer_id), LPARAM (NULL));
          Sleep(delay);
       }
    }
      

  18.   

    wm_timer会定时发送这是不用怀疑的.
    问题是messagebox后,为什么消息循环还在转?
      

  19.   

    毫不神奇的。。
    MessageBox实际就是创建一个Message对话框,然后这个对话框ShowModal而ShowModal也就是Show了之后,不断循环检查对话框状态,在这个循环中,
    在不断处理消息对列的,
    当对话框关闭时,这个循环才会被跳出,继续往下执行。。
      

  20.   

    WM_TIMER首先发送到主线程的消息队列,主线程再把该消息发送给对应窗口,也就是传到
    对应窗口的子线程的消息队列,之后被处理的
      

  21.   

    MessageBox后并不会阻塞主消息循环。
    举个简单的例子,创建一个简单的窗口,在WM_PAINT中TextOut一个字符串,想象一下,MessageBox弹出后,移动MessageBox框,你TextOut的字符串并没有乱,而是老老实实的在重绘,说明WM_PAINT一直在得到执行。既然主消息没有阻塞,那么很显然会一直的弹出MessageBox的对话框。
      

  22.   

    MessageBox后并不会阻塞主消息循环。