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

相关文章

PostgreSQL中rank()窗口函数实用指南与示例

《PostgreSQL中rank()窗口函数实用指南与示例》在数据分析和数据库管理中,经常需要对数据进行排名操作,PostgreSQL提供了强大的窗口函数rank(),可以方便地对结果集中的行进行排名... 目录一、rank()函数简介二、基础示例:部门内员工薪资排名示例数据排名查询三、高级应用示例1. 每

MyBatis中$与#的区别解析

《MyBatis中$与#的区别解析》文章浏览阅读314次,点赞4次,收藏6次。MyBatis使用#{}作为参数占位符时,会创建预处理语句(PreparedStatement),并将参数值作为预处理语句... 目录一、介绍二、sql注入风险实例一、介绍#(井号):MyBATis使用#{}作为参数占位符时,会

使用Python删除Excel中的行列和单元格示例详解

《使用Python删除Excel中的行列和单元格示例详解》在处理Excel数据时,删除不需要的行、列或单元格是一项常见且必要的操作,本文将使用Python脚本实现对Excel表格的高效自动化处理,感兴... 目录开发环境准备使用 python 删除 Excphpel 表格中的行删除特定行删除空白行删除含指定

全面掌握 SQL 中的 DATEDIFF函数及用法最佳实践

《全面掌握SQL中的DATEDIFF函数及用法最佳实践》本文解析DATEDIFF在不同数据库中的差异,强调其边界计算原理,探讨应用场景及陷阱,推荐根据需求选择TIMESTAMPDIFF或inte... 目录1. 核心概念:DATEDIFF 究竟在计算什么?2. 主流数据库中的 DATEDIFF 实现2.1

深入理解Go语言中二维切片的使用

《深入理解Go语言中二维切片的使用》本文深入讲解了Go语言中二维切片的概念与应用,用于表示矩阵、表格等二维数据结构,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧... 目录引言二维切片的基本概念定义创建二维切片二维切片的操作访问元素修改元素遍历二维切片二维切片的动态调整追加行动态

MySQL中的LENGTH()函数用法详解与实例分析

《MySQL中的LENGTH()函数用法详解与实例分析》MySQLLENGTH()函数用于计算字符串的字节长度,区别于CHAR_LENGTH()的字符长度,适用于多字节字符集(如UTF-8)的数据验证... 目录1. LENGTH()函数的基本语法2. LENGTH()函数的返回值2.1 示例1:计算字符串

prometheus如何使用pushgateway监控网路丢包

《prometheus如何使用pushgateway监控网路丢包》:本文主要介绍prometheus如何使用pushgateway监控网路丢包问题,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录监控网路丢包脚本数据图表总结监控网路丢包脚本[root@gtcq-gt-monitor-prome

Python通用唯一标识符模块uuid使用案例详解

《Python通用唯一标识符模块uuid使用案例详解》Pythonuuid模块用于生成128位全局唯一标识符,支持UUID1-5版本,适用于分布式系统、数据库主键等场景,需注意隐私、碰撞概率及存储优... 目录简介核心功能1. UUID版本2. UUID属性3. 命名空间使用场景1. 生成唯一标识符2. 数

Java中读取YAML文件配置信息常见问题及解决方法

《Java中读取YAML文件配置信息常见问题及解决方法》:本文主要介绍Java中读取YAML文件配置信息常见问题及解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要... 目录1 使用Spring Boot的@ConfigurationProperties2. 使用@Valu

SpringBoot中如何使用Assert进行断言校验

《SpringBoot中如何使用Assert进行断言校验》Java提供了内置的assert机制,而Spring框架也提供了更强大的Assert工具类来帮助开发者进行参数校验和状态检查,下... 目录前言一、Java 原生assert简介1.1 使用方式1.2 示例代码1.3 优缺点分析二、Spring Fr