为什么在WM_TIMER中的MessageBox会不停的出现
MessageBox不是要等到关闭了才会返回吗
似乎MessageBox会调用WndProc
请大侠帮我详细介绍一下WM_TIMER
MessageBox不是要等到关闭了才会返回吗
似乎MessageBox会调用WndProc
请大侠帮我详细介绍一下WM_TIMER
解决方案 »
- 对话框里有一个PictureBox控件,我想改变这个控件的背景色!!!!!!!!!
- 如何向所有窗口发送消息?
- 用waveOutSetVolume怎么保证两个声道一致
- DLL中使用CToolTipCtrl的问题
- 在1s内计数,是用settimer定时器还是用gettickcounte?
- 寻找最聪明的方法!!(数学问题)
- 小弟初学socket编程,而且是在SDK下作的,心中有疑问!急盼解决!!!1
- 为什么我的单行CEdit用SetSel()无效,而多行文本框可以?
- 困扰很久的连接错误
- 我在窗体中放了两个视,如何与同一个DOCUMENT相连?
- 关于工作区的问题,谢谢
- 如何将double 型转化成16进制, 谢谢
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,返回后重新设定定义器.
而是使用了一个循环,不断的去处理队列里面的消息。这时候,
WM_TIMER消息仍然
会被再次处理....
用线程解释狠明白!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.
再加上(李群康)的英文文献,学到很多!
我不同意.
这个消息是进消息队列的!!你上面列出的英文参考里说得很清楚"The WM_TIMER message is posted to the installing thread's message queue" halfdream(哈欠)说的应该是正解.messageBox内部有一个循环会处理当前线程的消息队列.
而且消息是被POST到程序的,而不是SEND。
而你的MessageBox函数需要你点击确定后才能执行完毕,你把这个函数放到了WM_TIMER消息中,那么就是说你的每个WM_TIMER消息的响应函数都没有执行完,因为你都没有点击MessageBox的确定,那么就无限的WM_TIMER下去了……
而是使用了一个循环,不断的去处理队列里面的消息。这时候,
WM_TIMER消息仍然
会被再次处理....
=====================================================
我认为应该是这样的,因为任何弹出MessageBox的窗口会重绘,不会因为MessageBox遮挡,而显示有问题。
而且,从调试的堆栈来看,MessageBox调用后,后一个被调用的就是WndProc
不过不知道msdn上市怎么写的
是吗?
你倒试试SetTimer(间隔设为500ms),然后在onTimer中sleep(5000)后执行一个函数,看是不是时间一到他就做.
"SetTimer(间隔设为500ms),然后在onTimer中sleep(5000)后执行一个函数..."这个函数会每隔5500ms执行一次
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);
}
}
问题是messagebox后,为什么消息循环还在转?
MessageBox实际就是创建一个Message对话框,然后这个对话框ShowModal而ShowModal也就是Show了之后,不断循环检查对话框状态,在这个循环中,
在不断处理消息对列的,
当对话框关闭时,这个循环才会被跳出,继续往下执行。。
对应窗口的子线程的消息队列,之后被处理的
举个简单的例子,创建一个简单的窗口,在WM_PAINT中TextOut一个字符串,想象一下,MessageBox弹出后,移动MessageBox框,你TextOut的字符串并没有乱,而是老老实实的在重绘,说明WM_PAINT一直在得到执行。既然主消息没有阻塞,那么很显然会一直的弹出MessageBox的对话框。