一、SendMessage
-
同步操作:
SendMessage
是一个同步函数,它会将消息发送到指定的窗口,并等待该窗口的消息处理过程完成,然后返回。这意味着它会阻塞当前线程,直到消息处理完成。 -
直接调用:
SendMessage
会将消息直接传递给目标窗口的消息处理函数,因此消息处理函数在当前线程中执行。这可以确保消息的有序处理,但也可能导致界面冻结,如果消息处理耗时较长。 -
用途: 通常用于在同一应用程序内的不同窗口之间传递消息,或者用于发送和接收系统消息
网上翻译的不直观,建议直接查看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
-
异步操作:
PostMessage
是一个异步函数,它会将消息放入目标窗口的消息队列中,然后立即返回。它不会等待消息处理完成。 -
间接调用:
PostMessage
不会立即调用目标窗口的消息处理函数。消息会在目标窗口的消息队列中排队,等待目标窗口的消息循环来处理。这意味着消息处理是在目标窗口的线程上执行的。 -
用途: 通常用于在不同线程之间传递消息,以避免界面冻结或执行长时间运行的任务。
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博客