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࿰…...
如何玩转澳大利亚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[这里的任何文本,即使是也被解释为文本而不是起始标签]]> 这是什么意思? 这段描述解释了XML中CDATA部分的作用和用法。让我来详细解释一下: CDATA(Character Da…...
C++的线程管理
C的线程管理 线程类(Thread)线程构造器约定构造器初始化构造器复制构造器移动构造器 多线程atomiccondition_variable应用实列 futurepromise应用实列 future应用实列 线程类(Thread) 执行线程是一个指令序列,它可以在…...
捷配笔记-如何设计PCB板布线满足生产标准?
PCB板布线是铺设连接各种设备与通电信号的路径的过程。PCB板布线是铺设连接各种设备与通电信号的路径的过程。 在PCB设计中,布线是完成产品设计的重要步骤。可以说,之前的准备工作已经为它做好了。在整个PCB设计中,布线设计过程具有最高的极限…...
【亲测免费】 为你的C Winform项目增添亮色:C Winform图标资源库推荐
为你的C# Winform项目增添亮色:C# Winform图标资源库推荐 【下载地址】CWinform图标资源库 C# Winform 图标资源库本仓库提供了一系列适用于 C# Winform 程序开发的图标资源,包括 ico 和 png 格式,尺寸涵盖 16x16、32x32 等多种常用大小 项…...
从运维老鸟视角看:为什么我依然推荐在2024年新服务器上安装CentOS 8.5(附最小化安装与安全加固清单)
2024年企业级服务器操作系统选择:CentOS 8.5的实战价值与安全实践 当各大技术社区都在讨论Rocky Linux和AlmaLinux如何完美替代CentOS时,作为一名经历过RHEL 4到CentOS Stream时代变迁的老运维,我依然会在特定场景的服务器采购清单上写下&quo…...
2025届学术党必备的六大降AI率助手解析与推荐
Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 身处人工智能生成内容也就是AIGC越来越普遍的大背景当中,怎样去有效地降低它被检…...
2026年AI工程化的5大发展趋势:从模型到产品的必经之路
2026年AI工程化的5大发展趋势:从模型到产品的必经之路 导读: AI模型越来越强大,但如何将其稳定、高效地部署到生产环境?本文结合我过去3年的MLOps实战经验,深度剖析2026年AI工程化的核心趋势,助你从“会调参…...
FigmaCN:打破语言壁垒,让Figma设计更高效的中文界面解决方案
FigmaCN:打破语言壁垒,让Figma设计更高效的中文界面解决方案 【免费下载链接】figmaCN 中文 Figma 插件,设计师人工翻译校验 项目地址: https://gitcode.com/gh_mirrors/fi/figmaCN 还在为Figma的英文界面而烦恼吗?你是否曾…...
SKNet核心机制解析与PyTorch实战:从Split-Fuse-Select到完整网络构建
1. SKNet核心机制解析:从Split-Fuse-Select到多尺度特征融合 SKNet(Selective Kernel Networks)是CVPR 2019提出的创新性网络结构,它在传统卷积神经网络的基础上引入了动态选择机制。这个机制的核心在于让网络能够自适应地选择不同…...
OpenClaw Zero Token 实测:不用 API Key,也能免费聚合多家 AI 模型
OpenClaw Zero Token 实测:不用 API Key,也能免费聚合多家 AI 模型 如果你经常在 Claude、ChatGPT、Gemini、DeepSeek、豆包、Kimi、Grok、通义千问之间来回切换,大概率会遇到一个问题: 每个平台都有自己的网页入口,…...
【深度解析】Hermes Agent 0.14:OpenAI 兼容本地代理、按需依赖加载与 AI Coding 工作流升级
摘要 Hermes Agent 0.14 是一次偏“基础设施”的重要更新:安装更简单、启动更轻量,并引入 OpenAI 兼容本地代理能力,使其更适合作为模型订阅、代码工具与本地工作流之间的 Agent 路由层。背景介绍 在 AI Coding 生态中,开发者常常…...
热敏电阻测温实战:从原理到Arduino/CircuitPython代码实现
1. 项目概述:从电阻到温度的桥梁在嵌入式开发和电子DIY项目中,温度测量是一个极其常见的需求。无论是环境监测、设备状态反馈,还是简单的温控风扇,你都需要一个可靠的“温度计”。市面上有琳琅满目的温度传感器,从数字…...
kernelbase.dll 怎么修复?按电脑小白能看懂的步骤来
看到 kernelbase.dll 缺失,很多人会担心是不是系统坏了。其实大多数 kernelbase.dll 报错都能按步骤排查,不需要一开始就重装系统,也不需要马上去下载单个 DLL 文件。下面这套方法按普通用户能操作的顺序来写。每一步只处理一个方向ÿ…...
