发广播消息时需要注意的地方
当你尝试发送广播消息(通过HWND_BROADCAST)时,请记住,这个广播消息必须具有全局的含义。
之前的一篇文章中,我讨论了各种消息范围的含义。请注意,只有系统定义的范围(0..WM_USER-1)和注册的消息范围(MAXINTATOM .. MAXWORD)具有全局含义。其他两个范围具有类特定或应用程序特定的含义。
换句话说,你无法在WM_USER范围内广播消息,因为该消息对每个窗口类都有不同的含义。
同样,WM_APP范围内的消息对每个应用程序都有不同的含义。
我们在Windows 95中遇到了这个问题。有些程序决定广播自定义私有消息,例如 WM_USER + 0x0100,打算将它们传递到该程序的其他实例。当然,当这些消息到达其他窗口时,它们将WM_USER + 0x0100解释为其他一些私人消息,并且表现得很异常或直接崩溃了。
另一方面,这些程序确实希望该消息到达其自身其他副本的窗口,因此我们不能仅仅阻止该程序的广播而停止工作。 应用程序依靠系统不试图阻止它们崩溃其他程序!
解决的办法是消除差异。如果你广播了不安全广播的消息,则Windows 95只会将其发送到旧式程序。新型程序(标记为4.0或更高版本)将不会收到该消息。这样,旧程序继续像往常一样相互影响,但是新程序遵循新规则。
另一个道义上的提示
当发送广播消息时,请确保每个接收它的窗口都有能力进行处理。
总结
广播自定义消息,确实不是一个十分靠谱的进程间通信方法。
咱们还是使用一些前人教导我们的传统方法,如共享内存,管道,WM_COPY之类的方法吧。
祝各位IPC愉快。
最后
Raymond Chen的《The Old New Thing》是我非常喜欢的博客之一,里面有很多关于Windows的小知识,对于广大Windows平台开发者来说,确实十分有帮助。
本文来自:《Broadcasting user-defined messages》
领取专属 10元无门槛券
私享最新 技术干货