看了<<程序员>>2001.7中的<<在Windows中发送消息>>一文后,写了一个小的sdk程序做实验。这是一个有简单的窗口和菜单的程序,我自定义了一个消息:
#define My_message 10000
然后在一个菜单中定义了发送这个消息的语句:
PostMessage(hwnd ,My_message,0,0);
在窗口函数的switch中可以处理这个消息,就是仅仅弹出一个MessageBox。如果给了hwnd这个参数那么就一切正常,如果使hwnd为NULL,就不会弹出MessageBox,但是文章中说“...窗口句柄HWND是NULL,PostMessage就投递消息到当前正在运行的线程的消息队列中...”,按这样理解窗口函数也应该能收到这个消息啊。但现在没有收到,那么PostMessage的HWND为空时到底把消息投到哪儿去了?
#define My_message 10000
然后在一个菜单中定义了发送这个消息的语句:
PostMessage(hwnd ,My_message,0,0);
在窗口函数的switch中可以处理这个消息,就是仅仅弹出一个MessageBox。如果给了hwnd这个参数那么就一切正常,如果使hwnd为NULL,就不会弹出MessageBox,但是文章中说“...窗口句柄HWND是NULL,PostMessage就投递消息到当前正在运行的线程的消息队列中...”,按这样理解窗口函数也应该能收到这个消息啊。但现在没有收到,那么PostMessage的HWND为空时到底把消息投到哪儿去了?
解决方案 »
- 我用CListCtrl的复选框属性,在win7下正常,在XP下复选框变得特别大
- 求救:如何去掉vs2005 编辑器里tab和空格区出现的右箭头和点!!
- 在IE工具栏添加按钮遇到问题!
- 请问,在char型字符串里查找指定的子串函数是什么?谢谢
- 求助:单文档程序统计中文个数问题
- Combo Box填入数据 却看不到
- MFC 的 Bug ?
- 怎样取得SuperGridCtrl的RootItem,Item,SubItem的内容?(分不够再开)
- 请问UPDATE-COMMAND-UI 是什么?
- 如何用指针代替数组
- 如何捕获重绘消息
- 使用ADO(msado15.dll)时为什么总是有警告?(warning C4146)
PostMessage将消息放到指定窗口的消息队列后立即返回。这种发送方式称为"邮寄"消息。如果消息队列中的邮寄消息缓冲区已满,则该函数返回错误值。
在下一个消息循环中,由 GetMessage 函数获得这个消息之后,窗口才会处理该消息。因此PostMessage 一般用于发送一些非关键性的消息。楼上同时提到了SendMessage,那么也同时说一下,并比较一下,可能你就可明白了:
SendMessage和 PostMessage 函数不同,它在发送一条消息给指定窗口时,将等待该消息被处理之后才会返回。当需要知道某个消息的处理结果时,使用该函数发送消息,然后根据其返回值进行处理。如果发送消息的线程和接收消息的线程不是同一个线程,发送消息的线程将阻塞并等待另一个线程的处理结果,然后继续运行;否则,SendMessage 函数将直接调用接收消息窗口的窗口过程函数。也就是说:
PostMessage只是把消息放入队列,不管其他程序是否处理都继续执行,而SendMessage必须等待其他程序处理消息后才继续执行。这两个函数的返回值也不同,PostMessage的返回值表示PostMessage函数执行是否正确,而SendMessage的返回值表示其他程序处理消息后的返回值。 这类的文章和书很多,可以很方便地找到更详细的资料。---
by Henry
[in] Handle to the window whose window procedure is to receive the message. The following values have special meanings.
HWND_BROADCAST
The message is posted to all top-level windows in the system, including disabled or invisible unowned windows, overlapped windows, and pop-up windows. The message is not posted to child windows.
NULL
The function behaves like a call to PostThreadMessage with the dwThreadId parameter set to the identifier of the current thread.如果是NULL的话,你的主线程要ON_THREAD_MESSAGE()才收的到啊。
每个程序都有消息循环,用来从队列中提取消息,通过HWND判断消息是不是发给自己的,是的话就进行处理,不是的就在将他还原到消息队列。
可以在GetMessage后判断msg.hwnd是不是NULL,如果是,就是一个线程消息,msg.hwnd=NULL的消息不会被Dispatch的。
while (GetMessage(&msg, NULL, 0, 0))
{
if(msg.massage==Mymassage)
{
.....
continue;
}
TranslateMessage(&msg);
DispatchMessage(&msg);
}
处理.