当前位置: 首页 > 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。

相关文章:

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

文章目录 1、SendMessage2、PostMessage3、两者的区别: 总结 在C#中,SendMessage和PostMessage是两个用于Windows编程的API,它们用于向窗口发送消息。这两个方法都位于System.Windows.Forms命名空间中,通常用于自动化Windows应用程…...

Transformer重要论文与书籍 - Transformer教程

近年来,人工智能领域中的Transformer模型无疑成为了炙手可热的研究对象。从自然语言处理(NLP)到计算机视觉,Transformer展现出了前所未有的强大能力。今天,我们将探讨Tra在当今的人工智能和机器学习领域,Tr…...

android13 rom 开发总纲说明

1. 这里是文章总纲,可以在这里快速找到需要的文章。 2. 文章一般是基于标准的android13,有一些文章可能会涉及到具体平台,例如全志,瑞芯微等一些平台。 3.系统应用 3.1系统应用Launcher3桌面相关: 3.2系统应用设置S…...

2.线性回归

简化的房价模型 假设1:影响房价的关键因素时卧室个数,卫生间和居住面积,记为 x 1 , x 2 , x 3 x_1,x_2,x_3 x1​,x2​,x3​ 假设2:成交价时关键因素的加权和: y w 1 x 1 w 2 x 2 w 3 x 3 b y w_1x_1w_2x_2w_3x…...

一文了解java中Optional

文章目录 1. Optional简介2. 常用的接口2.1 常用接口简单使用2.1.1 创建的常用方法2.1.2 获取值的常用方法2.1.3 判定的常用方法2.1.4 判定后的操作方法2.2 map方法介绍 2.2 其他方法2.2.1 Filter 方法2.2.2 FlatMap 方法 3. 常用的实例4. 总结 1. Optional简介 Optional是在ja…...

提示词工程(Prompt Engineering)是什么?

一、定义 Prompt Engineering 提示词工程(Prompt Engineering)是一项通过优化提示词(Prompt)和生成策略,从而获得更好的模型返回结果的工程技术。 二、System message 系统指令 System message可以被广泛应用在&am…...

vue对axios进行请求响应封装

一、原因 像是在一些业务逻辑上,比如需要在请求之前展示loading效果,或者在登录的时候判断身份信息(token)等信息有没有过期,再者根据服务器响应回来的code码进行相应的提示信息。等等在请求之前,之后做的一…...

快速测试electron环境是否安装成功

快速测试electron环境是否安装成功 测试代码正确运行的效果运行错误的效果v22.4.1 版本无法使用v20.15.1版本无法使用v18.20.4 版本无法使用 终极解决办法 测试代码 1.npx create-electron-app my-electron-app 2.cd my-electron-app 3.npm start 正确运行的效果 环境没问题…...

数电设计提问求帮助,出租车计费器。

🏆本文收录于《CSDN问答解惑-》专栏,主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&…...

xcode项目添加README.md文件并进行编辑

想要给xcode项目添加README.md文件其实还是比较简单的,但是对于不熟悉xcode这个工具的人来讲,还是有些陌生,下面简单给大家讲一下流程。 选择“文件”>“新建”>“文件”,在其他(滚动到工作表底部)下…...

基于 cookiecutter 的 python 项目模板

Cookiecutter 介绍 使用 Python 这种动态语言进行 web 开发,团队中经常会遇到的问题就是代码的质量比较难控制。Python 语言本身灵活性比较高,不加控制的情况下代码质量可能最后很难维护。而且代码的各方面的标准,比如提示的 lint&#xff0…...

如何玩转澳大利亚Facebook直播?

近年来,直播带货已经成为国内最赚钱的行业之一,各种玩法也越来越成熟。然而,在海外市场,尤其是澳大利亚,直播带货仍然是一片蓝海。作为社交媒体营销的主阵地,Facebook的直播功能却常常被卖家忽视。那么&…...

C# IOC容器、依赖注入和控制反转

控制反转(Inversion of Control, IoC) 定义:控制反转是一种设计原则,它反转了传统编程中的控制流程。在传统的编程模式中,组件之间的依赖关系是由组件自身在内部创建和维护的。而在控制反转模式中,这种依赖…...

论文学习_An Empirical Study of Deep Learning Models for Vulnerability Detection

1. 引言 研究背景:近年来,深度学习漏洞检测工具取得了可喜的成果。最先进的模型报告了 0.9 的 F1 分数,并且优于静态分析器。结果令人兴奋,因为深度学习可能会给软件保障带来革命性的变化。因此,IBM、谷歌和亚马逊等行业公司非常感兴趣,并投入巨资开发此类工具和数据集。…...

ctfshow-web入门-文件上传(web166、web167)(web168-web170)免杀绕过

目录 1、web166 2、web167 3、web168 4、web169 5、web170 1、web166 查看源码,前端只让传 zip 上传 zip 成功后可以进行下载 随便搞一个压缩包,使用记事本编辑,在其内容里插入一句话木马: 上传该压缩包,上传成功…...

Jitsi Meet指定用户成为主持人

前言 在Jitsi Meet进行会议的时候,我们有可能会使用到预约会议的这一个功能,预约会议的时候,我们希望我预约的会议,我就是主持人,而不希望其他人是主持人。 但是Jitsi Meet默认会认为第一个进入房间的是主持人&#…...

MySQL慢查询日志详解与性能优化指南

1. 什么是慢查询日志 慢查询日志是MySQL提供的一种日志记录功能,它能够记录执行时间超过预设阈值的SQL查询语句,并将这些信息写入到日志文件中。 2. 查看慢查询日志的设置和状态 2.1 慢查询日志的开启状态和日志文件位置 通过以下命令可以查看慢查询…...

xml CDATA

]]>之间的任何内容标记为字符数据。内容不会被解释为标记。 <![CDATA[这里的任何文本&#xff0c;即使是也被解释为文本而不是起始标签]]> 这是什么意思? 这段描述解释了XML中CDATA部分的作用和用法。让我来详细解释一下&#xff1a; CDATA&#xff08;Character Da…...

C++的线程管理

C的线程管理 线程类&#xff08;Thread&#xff09;线程构造器约定构造器初始化构造器复制构造器移动构造器 多线程atomiccondition_variable应用实列 futurepromise应用实列 future应用实列 线程类&#xff08;Thread&#xff09; 执行线程是一个指令序列&#xff0c;它可以在…...

捷配笔记-如何设计PCB板布线满足生产标准?

PCB板布线是铺设连接各种设备与通电信号的路径的过程。PCB板布线是铺设连接各种设备与通电信号的路径的过程。 在PCB设计中&#xff0c;布线是完成产品设计的重要步骤。可以说&#xff0c;之前的准备工作已经为它做好了。在整个PCB设计中&#xff0c;布线设计过程具有最高的极限…...

DockerHub与私有镜像仓库在容器化中的应用与管理

哈喽&#xff0c;大家好&#xff0c;我是左手python&#xff01; Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库&#xff0c;用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...

UDP(Echoserver)

网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法&#xff1a;netstat [选项] 功能&#xff1a;查看网络状态 常用选项&#xff1a; n 拒绝显示别名&#…...

数据库分批入库

今天在工作中&#xff0c;遇到一个问题&#xff0c;就是分批查询的时候&#xff0c;由于批次过大导致出现了一些问题&#xff0c;一下是问题描述和解决方案&#xff1a; 示例&#xff1a; // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...

代理篇12|深入理解 Vite中的Proxy接口代理配置

在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...

算法:模拟

1.替换所有的问号 1576. 替换所有的问号 - 力扣&#xff08;LeetCode&#xff09; ​遍历字符串​&#xff1a;通过外层循环逐一检查每个字符。​遇到 ? 时处理​&#xff1a; 内层循环遍历小写字母&#xff08;a 到 z&#xff09;。对每个字母检查是否满足&#xff1a; ​与…...

JS手写代码篇----使用Promise封装AJAX请求

15、使用Promise封装AJAX请求 promise就有reject和resolve了&#xff0c;就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...

解决:Android studio 编译后报错\app\src\main\cpp\CMakeLists.txt‘ to exist

现象&#xff1a; android studio报错&#xff1a; [CXX1409] D:\GitLab\xxxxx\app.cxx\Debug\3f3w4y1i\arm64-v8a\android_gradle_build.json : expected buildFiles file ‘D:\GitLab\xxxxx\app\src\main\cpp\CMakeLists.txt’ to exist 解决&#xff1a; 不要动CMakeLists.…...

Vue ③-生命周期 || 脚手架

生命周期 思考&#xff1a;什么时候可以发送初始化渲染请求&#xff1f;&#xff08;越早越好&#xff09; 什么时候可以开始操作dom&#xff1f;&#xff08;至少dom得渲染出来&#xff09; Vue生命周期&#xff1a; 一个Vue实例从 创建 到 销毁 的整个过程。 生命周期四个…...

xmind转换为markdown

文章目录 解锁思维导图新姿势&#xff1a;将XMind转为结构化Markdown 一、认识Xmind结构二、核心转换流程详解1.解压XMind文件&#xff08;ZIP处理&#xff09;2.解析JSON数据结构3&#xff1a;递归转换树形结构4&#xff1a;Markdown层级生成逻辑 三、完整代码 解锁思维导图新…...

从零开始了解数据采集(二十八)——制造业数字孪生

近年来&#xff0c;我国的工业领域正经历一场前所未有的数字化变革&#xff0c;从“双碳目标”到工业互联网平台的推广&#xff0c;国家政策和市场需求共同推动了制造业的升级。在这场变革中&#xff0c;数字孪生技术成为备受关注的关键工具&#xff0c;它不仅让企业“看见”设…...