SendMessage和SendNotifyMessage的区别?

soloist 2002-04-22 12:11:14
WINDOWS 中窗口之间的通讯方法有不少,互发消息便是其中的一种。SendMessage和SendNotifyMessage这两个函数的作用就是向其它窗口发送消息。它们看起来很象,调用参数也一样,只是返回值不同,前者返回一个LRESULT,而后者返回一个BOOL。根据MSDN的描述,当这两个函数的调用者与接收消息的窗口处于同一线程时,两者的执行情况一样,都是等待消息被处理完以后再返回;而当它们处于不同线程时,SendMessage所在的线程将等待目标窗口所在线程处理完这个消息,其间它处于阻塞(BLOCK)状态,SendNotifyMessage则是仅仅将消息传给目标窗口的窗口过程函数,并立即返回,它不会一直等着这条消息被处理完。
在我的程序里我需要一些窗口在发生某些事情时能通知另外一个窗口。所以一开始我使用SendNotifyMessage来发送消息,调用形式如下:
SendNotifyMessage(hwnd,WM_NOTIFY,ControlID,(LRESULT)pNMHDR);
pNMHDR指向了一个NMHDR结构,这个结构里的code字段用我自己定义的通知代码填充。在2000底下,程序运行良好,消息能正常发送,目标窗口也能正常接收。但是在98底下,SendNotifyMessage就无论如何都不能成功执行,总是返回FALSE,这样一来目标窗口当然也就接收不到消息了。我没有办法,只好将所有的SendNotifyMessage全部替换为SendMessage,这时消息的发送和接收才按照我预计的方式进行。需要补充说明的是,在整个程序里我只有一个线程,所以这种情况下SendNotifyMessage和SendMessage应该是没有差别的,但是实际情况却让我百思不得其解。是我的理解不对还是MSDN描述有误?我真希望早点知道答案。
...全文
1181 8 打赏 收藏 举报
写回复
8 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
soloist 2002-05-15
我想弄明白为什么,不想讨论孰优孰劣.
  • 打赏
  • 举报
回复
winmai 2002-05-15
你想用SendNotifyMessage 可以立即返回,倒不如用 PostMessage 也可以立即返回,而且在98和2000里都好使。
  • 打赏
  • 举报
回复
soloist 2002-05-15
有人遇到过这个问题吗?
  • 打赏
  • 举报
回复
gancheng 2002-04-25
If the window was created by the calling thread, SendNotifyMessage calls the window procedure for the window and does not return until the window procedure has processed the message. If the window was created by a different thread, SendNotifyMessage passes the message to the window procedure and returns immediately; it does not wait for the window procedure to finish processing the message.

The SendMessage member function calls the window procedure directly and does not return until that window procedure has processed the message. This is in contrast to the PostMessage member function, which places the message into the window's message queue and returns immediately.

Messages in a message queue are retrieved by calls to the GetMessage or PeekMessage Windows function.

The Windows PostMessage function can be used to access another application.

以上SendNotifyMessage 、SendMessage和PostMessage 的MSDN描述,想必soloist (独行独奏) 已经看过了,我想你问的问题主要是为什么在98和2000下面会区别吧---我也很奇怪,但是我的代码中好像没有你说的问题啊,工作的很好,你仔细看看是不是你的机器上有其他的一些程序导致这样的后果?或者你的代码还有缺陷?
  • 打赏
  • 举报
回复
soloist 2002-04-25
有高手碰到这种问题吗?有人知道它们的区别吗?
  • 打赏
  • 举报
回复
soloist 2002-04-22
说实话,我需要消息立即被处理。
  • 打赏
  • 举报
回复
punkboy 2002-04-22
建议你使用PostMessage();
  • 打赏
  • 举报
回复
soloist 2002-04-22
(上一帖有乱码,重贴一次)
WINDOWS 中窗口之间的通讯方法有不少,互发消息便是其中的一种。SendMessage和SendNotifyMessage这两个函数的作用就是向其它窗口发送消息。它们看起来很象,调用参数也一样,只是返回值不同,前者返回一个LRESULT,而后者返回一个BOOL。根据MSDN的描述,当这两个函数的调用者与接收消息的窗口处于同一线程时,两者的执行情况一样,都是等待消息被处理完以后再返回;而当它们处于不同线程时,SendMessage所在的线程将等待目标窗口所在线程处理完这个消息,其间它处于阻塞(BLOCK)状态,SendNotifyMessage则是仅仅将消息传给目标窗口的窗口过程函数,并立即返回,它不会一直等着这条消息被处理完。
在我的程序里我需要一些窗口在发生某些事情时能通知另外一个窗口。所以一开始我使用SendNotifyMessage来发送消息,调用形式如下:
SendNotifyMessage(hwnd,WM_NOTIFY,ControlID,(LRESULT)pNMHDR);
pNMHDR指向了一个NMHDR结构,这个结构里的code字段用我自己定义的通知代码填充。在2000底下,程序运行良好,消息能正常发送,目标窗口也能正常接收。但是在98底下,SendNotifyMessage就无论如何都不能成功执行,总是返回FALSE,这样一来目标窗口当然也就接收不到消息了。我没有办法,只好将所有的SendNotifyMessage全部替换为SendMessage,这时消息的发送和接收才按照我预计的方式进行。需要补充说明的是,在整个程序里我只有一个线程,所以这种情况下SendNotifyMessage和SendMessage应该是没有差别的,但是实际情况却让我百思不得其解。是我的理解不对还是MSDN描述有误?我真希望早点知道答案。

  • 打赏
  • 举报
回复
相关推荐
发帖
VC/MFC
加入

1.6w+

社区成员

VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
申请成为版主
帖子事件
创建了帖子
2002-04-22 12:11
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……