任何应用程序都可以发布和发送消息。像系统一样,应用程序通过将消息复制到消息队列来发布消息,并通过将消息数据作为参数传递给窗口过程来发送消息。要发布消息,应用程序使用PostMessage功能。应用程序可以通过调用SendMessage,BroadcastSystemMessage,SendMessageCallback,SendMessageTimeout,SendNotifyMessage或SendDlgItemMessage功能发送消息。
应用程序通常发布消息以通知特定窗口执行任务。PostMessage为邮件创建MSG结构,并将邮件复制到邮件队列。应用程序的消息循环最终将检索消息并将其分派到适当的窗口过程。
应用程序通常发送一个消息来通知窗口过程以立即执行任务。SendMessage函数将消息发送到与给定窗口对应的窗口过程。该函数等待窗口过程完成处理,然后返回消息结果。父窗子经常通过相互发送信息进行沟通。例如,具有编辑控件作为其子窗口的父窗口可以通过向其发送消息来设置控件的文本。该控件可以通过向父窗口发送消息,向父窗口通知用户执行的文本的更改。
SendMessageCallback功能也会向与给定窗口对应的窗口过程发送一条消息。但是,此函数会立即返回。窗口过程处理消息后,系统调用指定的回调函数。有关回调函数的更多信息,请参阅SendAsyncProc函数。
有时候,您可能希望向系统中的所有顶级窗口发送或发送消息。例如,如果应用程序更改系统时间,它必须通过发送WM_TIMECHANGE消息通知所有顶级窗口关于更改。应用程序可以通过调用SendMessage或PostMessage功能并在【HWND】参数中指定HWND_TOPMOST来向所有顶级窗口发送或发布消息。您还可以通过调用BroadcastSystemMessage功能并在【uiMessage】参数中指定BSM_APPLICATIONS来向所有应用程序广播消息。
应用程序可以发布消息而不指定窗口。如果应用程序在调用PostMessage时提供NULL窗口句柄,则该消息将发布到与当前线程相关联的队列中。因为没有指定窗口句柄,应用程序必须在消息循环中处理消息。这是创建适用于整个应用程序而不是特定窗口的消息的一种方法。
通过使用InSendMessage功能,窗口过程可以确定它是否正在处理另一个线程发送的消息。当消息处理取决于消息的来源时,此函数非常有用。
常见的编程错误是假设PostMessage函数总是发布一条消息。当消息队列已满时,这是不正确的。应用程序应检查PostMessage函数的返回值,以确定消息是否已发布,如果尚未发布,则重新发送。