C++中PostMessage和SendMessage函数的用途、区别、使用方法及使用示例

2024-03-14 21:44

本文主要是介绍C++中PostMessage和SendMessage函数的用途、区别、使用方法及使用示例,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在C++的Windows编程中,PostMessageSendMessage是用于进程间通信(IPC)的重要函数,特别是在同一应用程序的不同部分或不同应用程序之间发送消息时。这两个函数都用于向窗口发送消息,但它们在发送方式和行为上有所不同。

PostMessage

PostMessage函数将消息放入指定窗口的消息队列中,并立即返回。它不会等待消息被处理就继续执行。这是异步操作,发送消息的线程不会被阻塞。

用途
  • 当你不关心消息何时被处理,或者不想发送消息的线程被阻塞时。
  • 当消息处理可以稍后进行,不需要立即结果时。
使用方法
BOOL PostMessage(HWND   hWnd,       // 窗口句柄UINT   Msg,        // 消息标识符WPARAM wParam,     // 附加的消息信息LPARAM lParam      // 附加的消息信息
);
使用示例
HWND hwnd = /* 获取目标窗口句柄 */;
PostMessage(hwnd, WM_COMMAND, (WPARAM)ID_MYCOMMAND, 0);

SendMessage

SendMessage函数向指定的窗口发送消息,并等待窗口处理完该消息后才返回。这是同步操作,发送消息的线程会被阻塞,直到接收窗口处理完消息为止。

用途
  • 当你需要确保消息被处理,并获取处理结果时。
  • 当消息需要立即处理,并且发送线程需要等待其完成时。
使用方法
LRESULT SendMessage(HWND   hWnd,       // 窗口句柄UINT   Msg,        // 消息标识符WPARAM wParam,     // 附加的消息信息LPARAM lParam      // 附加的消息信息
);
使用示例
HWND hwnd = /* 获取目标窗口句柄 */;
LRESULT result = SendMessage(hwnd, WM_GETTEXT, (WPARAM)bufferSize, (LPARAM)buffer);

区别

  • 同步与异步SendMessage是同步的,它会阻塞发送消息的线程直到消息被处理;PostMessage是异步的,它立即返回,不会等待消息被处理。
  • 返回值SendMessage返回消息处理的结果;PostMessage返回一个布尔值,表示消息是否成功放入队列。
  • 性能影响SendMessage可能导致发送线程阻塞,从而影响性能;PostMessage不会阻塞发送线程,性能影响较小。

综合示例

下面是一个简单的示例,演示了如何使用PostMessageSendMessage

#include <Windows.h>LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {switch (uMsg) {case WM_USER: {// 处理自定义消息char* text = (char*)lParam;MessageBox(hwnd, text, "Custom Message", MB_OK);break;}case WM_CLOSE:DestroyWindow(hwnd);break;default:return DefWindowProc(hwnd, uMsg, wParam, lParam);}return 0;
}int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {const char CLASS_NAME[] = "Sample Window Class";WNDCLASS wc = { };wc.lpfnWndProc = WindowProc;wc.hInstance = hInstance;wc.lpszClassName = CLASS_NAME;if (!RegisterClass(&wc)) {MessageBox(NULL, "Window Registration Failed!", "Error!", MB_ICONEXCLAMATION | MB_OK);return 0;}HWND hwnd = CreateWindowEx(0, CLASS_NAME, "Sample Window", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 240, 120, NULL, NULL, hInstance, NULL);if (hwnd == NULL) {MessageBox(NULL, "Window Creation Failed!", "Error!", MB_ICONEXCLAMATION | MB_OK);return 0;}ShowWindow(hwnd, nCmdShow);UpdateWindow(hwnd);// 使用 PostMessage 发送自定义消息char* customMessage = "Hello from PostMessage!";PostMessage(hwnd, WM_USER, 0, (LPARAM)customMessage);// 使用 SendMessage 设置窗口文本(假设有相应的处理逻辑)SendMessage(hwnd, WM_SETTEXT,  0, (LPARAM)customMessage);

这篇关于C++中PostMessage和SendMessage函数的用途、区别、使用方法及使用示例的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/809805

相关文章

使用Python实现IP地址和端口状态检测与监控

《使用Python实现IP地址和端口状态检测与监控》在网络运维和服务器管理中,IP地址和端口的可用性监控是保障业务连续性的基础需求,本文将带你用Python从零打造一个高可用IP监控系统,感兴趣的小伙... 目录概述:为什么需要IP监控系统使用步骤说明1. 环境准备2. 系统部署3. 核心功能配置系统效果展

使用Java将各种数据写入Excel表格的操作示例

《使用Java将各种数据写入Excel表格的操作示例》在数据处理与管理领域,Excel凭借其强大的功能和广泛的应用,成为了数据存储与展示的重要工具,在Java开发过程中,常常需要将不同类型的数据,本文... 目录前言安装免费Java库1. 写入文本、或数值到 Excel单元格2. 写入数组到 Excel表格

redis中使用lua脚本的原理与基本使用详解

《redis中使用lua脚本的原理与基本使用详解》在Redis中使用Lua脚本可以实现原子性操作、减少网络开销以及提高执行效率,下面小编就来和大家详细介绍一下在redis中使用lua脚本的原理... 目录Redis 执行 Lua 脚本的原理基本使用方法使用EVAL命令执行 Lua 脚本使用EVALSHA命令

C#如何调用C++库

《C#如何调用C++库》:本文主要介绍C#如何调用C++库方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录方法一:使用P/Invoke1. 导出C++函数2. 定义P/Invoke签名3. 调用C++函数方法二:使用C++/CLI作为桥接1. 创建C++/CL

Java 中的 @SneakyThrows 注解使用方法(简化异常处理的利与弊)

《Java中的@SneakyThrows注解使用方法(简化异常处理的利与弊)》为了简化异常处理,Lombok提供了一个强大的注解@SneakyThrows,本文将详细介绍@SneakyThro... 目录1. @SneakyThrows 简介 1.1 什么是 Lombok?2. @SneakyThrows

Python中的Walrus运算符分析示例详解

《Python中的Walrus运算符分析示例详解》Python中的Walrus运算符(:=)是Python3.8引入的一个新特性,允许在表达式中同时赋值和返回值,它的核心作用是减少重复计算,提升代码简... 目录1. 在循环中避免重复计算2. 在条件判断中同时赋值变量3. 在列表推导式或字典推导式中简化逻辑

判断PyTorch是GPU版还是CPU版的方法小结

《判断PyTorch是GPU版还是CPU版的方法小结》PyTorch作为当前最流行的深度学习框架之一,支持在CPU和GPU(NVIDIACUDA)上运行,所以对于深度学习开发者来说,正确识别PyTor... 目录前言为什么需要区分GPU和CPU版本?性能差异硬件要求如何检查PyTorch版本?方法1:使用命

Python位移操作和位运算的实现示例

《Python位移操作和位运算的实现示例》本文主要介绍了Python位移操作和位运算的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录1. 位移操作1.1 左移操作 (<<)1.2 右移操作 (>>)注意事项:2. 位运算2.1

Qt实现网络数据解析的方法总结

《Qt实现网络数据解析的方法总结》在Qt中解析网络数据通常涉及接收原始字节流,并将其转换为有意义的应用层数据,这篇文章为大家介绍了详细步骤和示例,感兴趣的小伙伴可以了解下... 目录1. 网络数据接收2. 缓冲区管理(处理粘包/拆包)3. 常见数据格式解析3.1 jsON解析3.2 XML解析3.3 自定义

使用Python和Pyecharts创建交互式地图

《使用Python和Pyecharts创建交互式地图》在数据可视化领域,创建交互式地图是一种强大的方式,可以使受众能够以引人入胜且信息丰富的方式探索地理数据,下面我们看看如何使用Python和Pyec... 目录简介Pyecharts 简介创建上海地图代码说明运行结果总结简介在数据可视化领域,创建交互式地