发布和发送消息(Posting and Sending Messages)

本文详细阐述了在应用程序开发中如何有效地发布和发送消息。包括使用PostMessage和SendMessage函数实现不同场景下的消息传递,如发布消息到特定窗口或整个应用程序,以及发送消息以即时执行任务。同时,讨论了消息队列的限制和如何处理消息队列满的情况,提供了关于消息处理的实用技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

发布和发送消息(Posting and Sending Messages)
       任何应用程序都可以发布和发送消息。像系统一样,应用程序通过复制消息到消息队列来发布消息,通过把消息作为参数传递给窗口过程来发送消息。应用程序可以利用PostMessage函数来发布消息。应用程序也可以通过调用SendMessage,BroadcastSystemMessage,SendMessageCallback,SendMessageTimeout,SendNotifyMessage和SendDlgItemMessage函数来发送消息。
        发布消息(Posting Messages)
        应用程序通过发布消息来通知窗口过程执行一个任务。PostMessage函数为消息创建一个MSG结构,并把消息复制到消息队列。应用程序的消息循环最终会获取这个消息,然后把这个消息分配给一个合适的窗口过程。
        应用程序可以发布一个不指定任何窗口的消息。当调用PostMessage函数时,如果应用程序提供一个空的窗口句柄,消息会被发布到与当前线程相关联的消息队列。因为没有指定窗口句柄,应用程序必须在消息循环中处理消息。这是一种创建应用于整个应用程序,而不是指定窗口的消息的方式。
        有时,你可能会为系统中的高级别窗口发布消息。应用程序通过调用PostMessage函数并指定hwnd的参数HWND_TOPMOST,可以为所有的高级别窗口发布消息。 
         一个普遍的程序错误是,假定PostMessage函数总是可以发布消息。当时当消息队列满时,这个假定是不正确的。应用程序应该检查PostMessage函数的返回值来确定消息是否被发布,如果没有的话,可以重新发布。
        发送消息(Sending Messages)
        应用程序通过发送消息来通知窗口过程立即执行一个任务。SendMessage函数发送消息到响应给定窗口的窗口过程。这个函数会等到窗口过程结束处理,然后返回消息结果。父窗口和子窗口经常会通过发送消息给对方来进行通信。例如,一个拥有编辑框作为子窗口的父窗口可以通过发送消息来设定文本控制。通过把消息发送回父窗口,控制可以通知父窗口用户输入文本的改变。
        SendMessageCallback函数也会发送消息到响应给定窗口的窗口过程。然而这个函数会立即返回。当窗口过程处理完消息后,系统会调用指定的回调函数。
        有时,你可能想发送消息给系统中的高级别窗口。例如,如果应用程序改变了系统时间,那么它必须把这个改变通过发送WM_TIMECHANGE消息告知所有的高级别窗口。应用程序可以通过调用SendMessage函数,指定hwnd参数值HWND_TOPMOST,发送消息给高级别窗口。你也可以通过调用BroadcastSystemMessage函数,指定lpdwRecipients参数值BSM_APPLICATIONS,把消息广播给所有的应用程序。
        利用InSendMessage或InSendMessageEx函数,窗口过程可以决定是否处理一个被另外的线程发送的消息。当消息处理依赖于消息起点时,这个能力是有用的。
### 如何在消息服务中实现沉默周期防止过度频繁的消息推送 为了防止消息推送过于频繁,在设计消息服务时可以引入沉默周期机制。当某个事件首次触发告警后,系统会记录下这次告警的时间戳,并在此后的特定时间段内不再对该相同类型的事件发出重复警告,这段时间即为沉默期。 具体来说,可以在接收到新事件请求时检查当前时间与上次同类型事件发生之间的时间差是否超过了预设的最小间隔。如果未超过,则忽略此次事件;反之则正常处理并更新最新的事件时间戳[^1]。 对于基于HTTP WebHook方式发送的通知而言,可以通过编程语言中的定时器功能来控制两次连续调用API之间的最短允许距离。例如Python脚本里利用`time.sleep()`函数暂停执行指定秒数: ```python import time def send_alert_with_silence_period(webhook_url, alert_message, last_send_time, silence_duration=60): current_time = int(time.time()) # Check if the difference between now and last sent is greater than or equal to silence duration if (current_time - last_send_time >= silence_duration): try: response = requests.post(url=webhook_url, json={"text":alert_message}) if response.status_code == 200: print("Alert successfully posted.") # Update the timestamp after successful posting. return current_time else: print(f"Failed to post alert. Status code {response.status_code}") except Exception as e: print(e) return last_send_time last_sent_timestamp = 0 while True: new_last_sent_ts = send_alert_with_silence_period( webhook_url="https://oapi.dingtalk.com/robot/send?access_token=your_access_token", alert_message="This is a test message.", last_send_time=last_sent_timestamp, silence_duration=60*5 # Set silent period for five minutes here ) # Only update when there was an actual sending attempt made. if new_last_sent_ts != last_sent_timestamp: last_sent_timestamp = new_last_sent_ts time.sleep(60) # Wait one minute before checking again. ``` 上述代码片段展示了如何向DingTalk机器人Webhook URL发送带有静默周期特性的提醒信息。每次循环迭代都会先判断自上一次成功发送以来是否已过去至少五分钟(可根据需求调整),只有在这种情况下才会尝试再次发送通知给目标聊天室成员。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值