MFC的SendMessage与PostMessage的区别

本文深入探讨了Windows消息处理中的SendMessage和PostMessage函数。详细解释了两者分别作为同步和异步消息传递机制的工作原理,包括如何使用它们进行消息传递,以及在不同场景下选择合适函数的考量。

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

一、SendMessage

  1. 同步操作: SendMessage 是一个同步函数,它会将消息发送到指定的窗口,并等待该窗口的消息处理过程完成,然后返回。这意味着它会阻塞当前线程,直到消息处理完成。

  2. 直接调用: SendMessage 会将消息直接传递给目标窗口的消息处理函数,因此消息处理函数在当前线程中执行。这可以确保消息的有序处理,但也可能导致界面冻结,如果消息处理耗时较长。

  3. 用途: 通常用于在同一应用程序内的不同窗口之间传递消息,或者用于发送和接收系统消息

网上翻译的不直观,建议直接查看MSDN

LRESULT SendMessage(
  HWND   hWnd,      // 目标窗口的句柄
  UINT   Msg,       // 消息类型
  WPARAM wParam,    // 消息的附加参数
  LPARAM lParam     // 消息的附加参数
);

 实例

// 向窗口发送 WM_CLOSE 消息,请求关闭窗口
::SendMessage(hWnd, WM_CLOSE, 0, 0);

// 向窗口发送自定义消息,传递两个参数
UINT customMessage = WM_USER + 1;  // 自定义消息,WM_USER 是一个用户自定义消息的基准值
WPARAM wParam = 42;
LPARAM lParam = 123;
::SendMessage(hWnd, customMessage, wParam, lParam);

二、PostMessage

  1. 异步操作: PostMessage 是一个异步函数,它会将消息放入目标窗口的消息队列中,然后立即返回。它不会等待消息处理完成。

  2. 间接调用: PostMessage 不会立即调用目标窗口的消息处理函数。消息会在目标窗口的消息队列中排队,等待目标窗口的消息循环来处理。这意味着消息处理是在目标窗口的线程上执行的。

  3. 用途: 通常用于在不同线程之间传递消息,以避免界面冻结或执行长时间运行的任务。

BOOL PostMessage(
  HWND   hWnd,      // 目标窗口的句柄
  UINT   Msg,       // 消息类型
  WPARAM wParam,    // 消息的附加参数
  LPARAM lParam     // 消息的附加参数
);

实例

BOOL result = PostMessage(hWnd, uMsg, wParam, lParam);

我们可以看到,其中 3 个参数的意义是一样的,返回值类型不同(其实从数据上看他们一样是一个 32 位的数,只是意义不一样),LRESULT 表示的是消息被处理后的返回值,BOOL 表示的是消息是不是 Post 成功。

三、总结

  • 如果需要在同一线程内的不同窗口之间同步传递消息或者需要确保消息有序处理,可以使用 SendMessage
  • 如果需要在不同线程之间异步传递消息,以避免阻塞当前线程,可以使用 PostMessage
  • 使用哪个函数取决于具体的需求和设计。需要根据情况来选择使用同步或异步消息传递。

需要注意的是,SendMessage和PostMessage函数的使用需要满足以下条件:

  • 目标窗口必须存在且可用。
  • 目标窗口的消息处理函数必须能够正确处理所发送的消息。
  • 消息类型(Msg)和附加参数(wParam和lParam)的取值要符合目标窗口消息处理函数的要求

参考:

sendmessage和postmessage的区别_sendmessage postmessage_紫色_麦迪的博客-CSDN博客

SendMessage和PostMessage发送消息(不同进程传递字符串)_sendmessage发送字符串_紫松Win的博客-CSDN博客

SendMessage和PostMessage - 21ic电子网

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值