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描述有误?我真希望早点知道答案。
...全文
1490 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
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描述有误?我真希望早点知道答案。

在C#中SendMessage和PostMessage的参数传递 在C#中可以使用Window API提供的SendMessage和PostMessage来传递参数。两者的区别简单介绍下:返回值的不同,我们先看一下 MSDN 里的声明: LRESULT SendMessage( HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam ); BOOL PostMessage( HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam ); 其中 4 个参数的意义是一样的,返回值类型不同(其实从数据上看他们一样是一个 32 位的数,只是意义不一样),LRESULT 表示的是消息被处理后的返回值,BOOL 表示的是消息是不是 Post 成功。 2、PostMessage 是异步的,SendMessage 是同步的。 PostMessage 只把消息放入队列,不管消息是否被处理就返回,消息可能不被处理;而 SendMessage 等待消息被处理完了之后才返回,如果消息不被处理,发送消息的线程将一直被阻塞。 3、如果在同一个线程内,SendMessage 发送消息时,由 USER32.DLL 模块调用目标窗口的消息处理程序,并将结果返回。SendMessage 在同一线程中发送消息并不入线程消息队列。PostMessage 发送消息时,消息要先放入线程的消息队列,然后通过消息循环分派到目标窗口(DispatchMessage)。 如果在不同线程内,SendMessage 发送消息到目标窗口所属线程的消息队列,然后发送消息的线程在 USER32.DLL 模块内监视和等待消息处理,直到目标窗口处理完返回。SendMessage 在返回前还做了很多工作,比如,响应别的线程向它 SendMessage。Post 到别的线程时,最好用 PostThreadMessage 代替 PostMessage,PostMessage 的 hWnd 参数可以是 NULL,等效于 PostThreadMessage + GetCurrentThreadId。Post WM_QUIT 时,应使用 PostQuitMessage 代替。 4、系统只整编(marshal)系统消息(0 到 WM_USER 之间的消息),发送用户消息(WM_USER 以上)到别的进程时,需要自己做整编。 用 PostMessageSendNotifyMessageSendMessageCallback 等异步函数发送系统消息时,参数里不可以使用指针,因为发送者并不等待消息的处理就返回,接受者还没处理指针就已经被释放了。 5、在 Windows 2000/XP 里,每个消息队列最多只能存放 10,000 个 Post 的消息,超过的还没被处理的将不会被处理,直接丢掉。这个值可以改得更大:[HKEY_LOCAL_MACHINE/SOFTWARE/ Microsoft/Windows NT/CurrentVersion/Windows] USERPostMessageLimit,最小可以是 4000。 PostMessage只负责将消息放到消息队列中,不确定何时及是否处理 SendMessage要等到受到消息处理的返回码(DWord类型)后才继续 PostMessage执行后马上返回 SendMessage必须等到消息被处理后才会返回。

16,548

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

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

试试用AI创作助手写篇文章吧