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

C# 下sendmessage和postmessage的区别详解与示例

文章目录

    • 1、SendMessage
    • 2、PostMessage
    • 3、两者的区别:
  • 总结

在这里插入图片描述


在C#中,SendMessage和PostMessage是两个用于Windows编程的API,它们用于向窗口发送消息。这两个方法都位于System.Windows.Forms命名空间中,通常用于自动化Windows应用程序的用户界面元素。

1、SendMessage

SendMessage方法用于直接发送消息到一个窗口句柄。这个方法会立即将消息发送到目标窗口,并且会等待窗口处理完消息后才继续执行后续代码。

示例代码及解释:

using System;
using System.Windows.Forms;
using System.Runtime.InteropServices;class Program
{static void Main(){[DllImport("user32.dll")]private static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, int wParam, int lParam);const uint WM_MOUSEMOVE = 0x0200;// 假设我们已经找到了目标窗口的句柄IntPtr hWnd = FindWindow(null, "目标窗口标题");// 发送一个自定义消息const int WM_MY_MESSAGE = 0x03E8;SendMessage(hWnd, WM_MY_MESSAGE, 0, 0);// 在这个例子中,我们发送了一个自定义消息WM_MY_MESSAGE到目标窗口。// 由于我们没有定义消息的处理函数,所以这个消息会被忽略,// 但是SendMessage会等待窗口处理完这个消息后才继续执行。}
}

2、PostMessage

PostMessage方法也用于向窗口发送消息,但是与SendMessage不同,它不会等待窗口处理完消息。PostMessage会将消息放入目标窗口的消息队列中,然后立即返回,允许调用者在处理完消息队列中的其他消息后,继续执行后续代码。

示例代码及解释:

using System;
using System.Windows.Forms;
using System.Runtime.InteropServices;class Program
{static void Main(){[DllImport("user32.dll")]private static extern bool PostMessage(IntPtr hWnd, uint Msg, int wParam, int lParam);const uint WM_MOUSEMOVE = 0x0200;// 假设我们已经找到了目标窗口的句柄IntPtr hWnd = FindWindow(null, "目标窗口标题");// 发送一个自定义消息const int WM_MY_MESSAGE = 0x03E8;PostMessage(hWnd, WM_MY_MESSAGE, 0, 0);// 在这个例子中,我们同样发送了一个自定义消息WM_MY_MESSAGE到目标窗口。// 但是,与SendMessage不同,PostMessage不会等待窗口处理这个消息。// 发送消息后,PostMessage立即返回,允许我们的程序继续执行。// 这意味着,如果目标窗口的消息队列中有其他消息在等待处理,// 那么我们的消息可能会被推迟处理,甚至可能被忽略。}
}

3、两者的区别:

返回时间

  • SendMessage: 该函数发送消息后立即返回,不会等待窗口过程处理完消息。因此,SendMessage 是非阻塞的。
  • PostMessage: 该函数将消息放入目标窗口的消息队列中,并立即返回。消息会在目标窗口的消息循环中被处理。PostMessage 也是非阻塞的。

返回值

  • SendMessage: 发送消息后,如果没有窗口处理该消息,则返回一个错误代码。如果消息被处理,则没有特定的返回值。
  • PostMessage: 函数本身不返回任何值,但可以通过窗口过程的 lResult 参数来传递返回值。

同步异步

  • SendMessage: 它是同步的,因为它立即发送消息并等待窗口过程处理。
  • PostMessage: 它是异步的,因为消息被放入消息队列后,发送函数立即返回,允许其他窗口处理消息。

发送过程中的区别

  • SendMessage: 可以直接发送消息给指定窗口,无论该窗口属于哪个线程。这是在较低级别线程间通信的方式。
  • PostMessage: 通常用于同一进程内的同一线程的不同窗口之间通信。它不会跨线程边界发送消息,但可以在同一线程的不同窗口间传递消息。

消息处理

  • PostMessage将消息放入队列,目标窗口在处理消息时可能会按照自己的逻辑顺序处理这些消息
  • SendMessage则是立即发送消息,目标窗口会立即处理。

可靠性

  • PostMessage可能更可靠,因为它不会因为窗口的当前状态而导致消息丢失。
  • SendMessage可能会因为窗口当前状态(如不可见)而导致消息丢失。

使用场景

  • SendMessage: 通常用于跨线程操作,比如在一个线程中更新另一个线程的UI。
  • PostMessage: 常用于在同一线程内异步操作,比如在UI线程中处理耗时操作,而不阻塞UI线程。

总结

SendMessage和PostMessage都是用于窗口消息传递的方法,但它们在使用方式和功能上存在一些差异。SendMessage是直接发送消息,而PostMessage是将消息放入队列中,稍后发送。在实际应用中,可以根据需求选择合适的 method。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • //usr/lib/libgdal.so.20:对‘sqlite3_column_table_name’未定义的引用
  • Golang | Leetcode Golang题解之第222题完全二叉树的节点个数
  • 数据库详细复习第三章SQL语句
  • java入门-面向对象基础(this关键字)
  • 大数据面试题之数据库(2)
  • 【数学建模】2005建模A题:长江水质综合评价与预测
  • 光伏电站数据采集方案(基于工业路由器部署)
  • 问题集锦3
  • 鹦鹉智能财税系统:代账公司的智能化升级之路
  • adobe pdf设置默认打开是滚动而不是单页视图
  • Rust简明教程第三章-所有权与借用
  • C++:cv.contourArea()函数解析
  • 前端视角下的Spring-Boot语法学习:打印 hello-world
  • 楼梯导航案例
  • 基于vue的引入登录界面
  • 0基础学习移动端适配
  • AWS实战 - 利用IAM对S3做访问控制
  • javascript 哈希表
  • nginx 负载服务器优化
  • Python学习之路13-记分
  • 关于List、List?、ListObject的区别
  • 入门级的git使用指北
  • 入手阿里云新服务器的部署NODE
  • 视频flv转mp4最快的几种方法(就是不用格式工厂)
  • 系统认识JavaScript正则表达式
  • 责任链模式的两种实现
  • 找一份好的前端工作,起点很重要
  • 自制字幕遮挡器
  • Java总结 - String - 这篇请使劲喷我
  • 翻译 | The Principles of OOD 面向对象设计原则
  • ​Base64转换成图片,android studio build乱码,找不到okio.ByteString接腾讯人脸识别
  • # MySQL server 层和存储引擎层是怎么交互数据的?
  • # Panda3d 碰撞检测系统介绍
  • # Redis 入门到精通(九)-- 主从复制(1)
  • #define与typedef区别
  • #ubuntu# #git# repository git config --global --add safe.directory
  • #宝哥教你#查看jquery绑定的事件函数
  • $L^p$ 调和函数恒为零
  • (2024最新)CentOS 7上在线安装MySQL 5.7|喂饭级教程
  • (6)STL算法之转换
  • (70min)字节暑假实习二面(已挂)
  • (BFS)hdoj2377-Bus Pass
  • (cljs/run-at (JSVM. :browser) 搭建刚好可用的开发环境!)
  • (Git) gitignore基础使用
  • (ZT)北大教授朱青生给学生的一封信:大学,更是一个科学的保证
  • (附源码)springboot建达集团公司平台 毕业设计 141538
  • (附源码)计算机毕业设计ssm-Java网名推荐系统
  • (六) ES6 新特性 —— 迭代器(iterator)
  • (四)JPA - JQPL 实现增删改查
  • (详细文档!)javaswing图书管理系统+mysql数据库
  • (转)setTimeout 和 setInterval 的区别
  • **CI中自动类加载的用法总结
  • .NET Conf 2023 回顾 – 庆祝社区、创新和 .NET 8 的发布
  • .net core + vue 搭建前后端分离的框架
  • .NET Entity FrameWork 总结 ,在项目中用处个人感觉不大。适合初级用用,不涉及到与数据库通信。