当前位置: 首页 > news >正文

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);

相关文章:

  • IDEA启动项目到一半后卡住但不报错的解决方法分享
  • [MYSQL数据库]- 索引
  • ElasticSearch深度分页问题如何解决
  • 数据结构:图的存储与遍历(待续)
  • 同态滤波算法详解
  • Docker进阶:深入了解 Dockerfile
  • 采购代购系统独立站,接口采集商品上货
  • L1-039 古风排版(C++)
  • 基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的条形码二维码检测系统(深度学习+UI界面+训练数据集+Python代码)
  • Oracle 死锁、指标汇总
  • 有点NB的免费wordpress主题模板
  • Neo4j 批量导入数据 从官方文档学习LOAD CSV 命令 小白可食用版
  • PHP+Lunix+GIT 如何快速使用宝塔WebHook快速自动化部署
  • C++训练营:引用传递
  • 计算机服务器中了devos勒索病毒怎么解密,devos勒索病毒解密工具流程
  • 【腾讯Bugly干货分享】从0到1打造直播 App
  • 5分钟即可掌握的前端高效利器:JavaScript 策略模式
  • ES6简单总结(搭配简单的讲解和小案例)
  • JavaScript新鲜事·第5期
  • Java多态
  • Js基础知识(四) - js运行原理与机制
  • Python进阶细节
  • Spring Cloud Feign的两种使用姿势
  • UEditor初始化失败(实例已存在,但视图未渲染出来,单页化)
  • vuex 学习笔记 01
  • XML已死 ?
  • Yii源码解读-服务定位器(Service Locator)
  • 从零开始的webpack生活-0x009:FilesLoader装载文件
  • 短视频宝贝=慢?阿里巴巴工程师这样秒开短视频
  • 发布国内首个无服务器容器服务,运维效率从未如此高效
  • 基于webpack 的 vue 多页架构
  • 技术:超级实用的电脑小技巧
  • 精彩代码 vue.js
  • 如何优雅的使用vue+Dcloud(Hbuild)开发混合app
  • 入职第二天:使用koa搭建node server是种怎样的体验
  • 协程
  • 异步
  • 源码安装memcached和php memcache扩展
  • d²y/dx²; 偏导数问题 请问f1 f2是什么意思
  • 阿里云服务器购买完整流程
  • 说说我为什么看好Spring Cloud Alibaba
  • #{}和${}的区别是什么 -- java面试
  • #Linux(帮助手册)
  • #Ubuntu(修改root信息)
  • #每天一道面试题# 什么是MySQL的回表查询
  • #我与Java虚拟机的故事#连载03:面试过的百度,滴滴,快手都问了这些问题
  • #职场发展#其他
  • $(document).ready(function(){}), $().ready(function(){})和$(function(){})三者区别
  • $分析了六十多年间100万字的政府工作报告,我看到了这样的变迁
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第2节(共同的基类)
  • (TipsTricks)用客户端模板精简JavaScript代码
  • (ZT)出版业改革:该死的死,该生的生
  • (附源码)springboot家庭财务分析系统 毕业设计641323
  • (强烈推荐)移动端音视频从零到上手(下)
  • (十一)图像的罗伯特梯度锐化