WindowsAPI中PostMessage与SendMessage的区别

2023-05-16

1、返回值意义的区别,先看一下 MSDN 里的声明:
LRESULT SendMessage(
        HWND hWnd,
        UINT Msg,
        WPARAM wParam,
        LPARAM lParam
);
BOOL PostMessage(
        HWND hWnd,
        UINT Msg,
        WPARAM wParam,
        LPARAM lParam
);
  其 4 个参数的意义是一样的,返回值类型不同。PostMessage的返回值(BOOL)表示PostMessage函数执行是否正确,SendMessage的返回值(LRESULT )表示其他程序处理消息后的返回值。

2、PostMessage 是异步的,SendMessage 是同步的。
  PostMessage 只把消息放入队列,不管消息是否被处理就返回,消息可能不被处理;而 SendMessage 等待消息被处理完了之后才返回,如果消息不被处理,发送消息的线程将一直被阻塞。

3、 当一个线程向该线程所建立的窗口SendMessage消息时,由 USER32.DLL 模块调用目标窗口的消息处理程序,并将结果返回,它只是调用指定窗口的消息处理过程,并不将消息入队列。当一个线程向另一个线程所建立的窗口 SendMessage时,该消息要追加到接收消息线程的发送消息队列,然后发送消息的线程进入等待状态,接收消息的线程处理完该消息后,由系统唤醒发送 消息的线程,这时发送线程继续进行。PostMessage 发送消息时,消息要先放入线程的消息队列,然后通过消息循环分派到目标窗口(DispatchMessage)。一个线程的消息队列实际上分为四种不同的 消息队列:Post消息队列、Send消息队列、输入消息队列、应答消息队列。PostMessage是将消息追加到Post消息队列,SendMessage是追加到Send消息队列,两个队列处理的优先级并不一样。

//*****

1.返回值

  其中 函数4 个参数的意义是一样的,返回值类型不同(其实从数据上看他们一样是一个 32 位的数,只是意义不一样),LRESULT 表示的是消息被处理后的返回值,BOOL 表示的是消息是不是 Post 成功。

1

2

3

4

LRESULT SendMessage (  HWND hWnd,

        UINT Msg,

        WPARAM wParam,

        LPARAM lParam );

1

2

3

4

BOOL PostMessage(  HWND hWnd,

        UINT Msg,

        WPARAM wParam,

        LPARAM lParam);

  2、PostMessage 是异步的,SendMessage 是同步的。    

     PostMessage 只把消息放到队列,不管消息是不是被处理就返回,消息可能不被处理;

               SendMessage等待消息被处理完了才返回,如果消息不被处理,发送消息的线程将一直处于阻塞状态,等待消息的返回。

  

    同一个线程内:

       SendMessage 发送消息时,由USER32.DLL模块调用目标窗口的消息处理程序,并将结果返回,SendMessage 在同一个线程里面发送消息不进入线程消息队列;PostMessage 发送的消息要先放到消息队列,然后通过消息循环分派到目标窗口(DispatchMessage)。

              不同线程内:

               SendMessage 发送消息到目标窗口的消息队列,然后发送消息的线程在USER32.DLL模块内监视和等待消息的处理结果,直到目标窗口的才处理返回,SendMessage在返回之前还需要做许多工作,如响应别的线程向它发送的SendMessage().PostMessge() 到别的线程的时候最好使用PostThreadMessage   代替。PostMessage()的HWND 参数可以为NULL,相当于PostThreadMessage() + GetCrrentThreadId.

   3.系统只整理和编号系统消息(0 到 WM_USER 之间的消息),发送用户消息(WM_USER 以上)到别的进程时,需要自己定义。

   用 PostMessage、SendNotifyMessage、SendMessageCallback 等异步函数发送系统消息时,参数里不可以使用指针,因为发送者并不等待消息的处理就返回,接受者还没处理指针就已经被释放了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

WindowsAPI中PostMessage与SendMessage的区别 的相关文章

随机推荐

  • JSON数据格式详解

    文章目录 JSON数据格式概念 JSON的简单数据 JSON对象 对象的属性也可以是JSON对象 JSON格式表示简单数组 对象数组 使用二维数组保存 二维数组 访问淘宝的接口也可以取得JSON格式的数据 将一个对象转换成JSON数据 将一
  • C# 创建一个简单的WebApi项目

    一 创建Web API 1 创建一个新的web API项目 启动VS 2013 并在 开始页 选择 新项目 或从 文件 菜单选择 新建 然后选择 项目 在 模板 面板中选择 已安装模板 并展开 Visual C 节点 选择该节点下的 Web
  • C# 编写Web API

    1 创建Web API项目 打开VS2012 gt FILE gt New gt Project gt Web gt ASP NET MVC 4 Web Application 修改名字为WebAPIApplication 单击OK 在Pr
  • C# WebApi 返回JSON类型

    在默认情况下 当我们新建一个webapi项目 会自动返回XML格式的数据 如果我们想返回JSON的数据 可以设置下面的三种方法 nbsp 1 不用改配置文件 在Controller的方法中 直接返回HttpResponseMessage p
  • c#通过HttpClient来调用Web Api接口

    lt summary gt HttpClient实现Post请求 异步 lt summary gt static async void dooPost string url http localhost 52824 api register
  • c#使用HttpClient调用WebApi

    调用WebApi 可以利用HttpClient来进行Web Api的调用 由于WebA Api的调用本质上就是一次普通的发送请求与接收响应的过程 xff0c 所有HttpClient其实可以作为一般意义上发送HTTP请求的工具 using
  • C#中通过HttpClient发送Post请求

    C 中HttpClient进行各种类型的传输 我们可以看到 尽管PostAsync有四个重载函数 但是接受的都是HttpContent 而查看源码可以看到 HttpContent是一个抽象类 那我们就不可能直接创建HttpContent的实
  • c#中WepAPI(post/get)控制器方法创建和httpclient调用webAPI实例

    一 xff1a WebAPI创建 using System using System Collections Generic using System Linq using System Net Http using System Text
  • c#中Task线程的用法

    1 Task的优势 ThreadPool相比Thread来说具备了很多优势 xff0c 但是ThreadPool却又存在一些使用上的不方便 比如 xff1a ThreadPool不支持线程的取消 完成 失败通知等交互性操作 xff1b Th
  • C# 中对象与JSON字符串相互转换的三种方法

    JSON JavaScript Object Notation JS 对象标记 是一种轻量级的数据交换格式 关于内存对象和JSON字符串的相互转换 xff0c 在实际项目中应比较广泛 xff0c 经过一番搜索 xff0c 找到如下三种方法来
  • 解决VM虚拟机中ubuntu系统上不了网的问题

    最简单的方式 关闭虚拟机在对应的虚拟机上右键 xff0c 点击设置 xff0c 找到网络适配器 xff0c 点击移除 xff0c 再次点击添加 xff0c 将网络适配器再次添加回来 xff0c 点击确定重启虚拟机 如果第一种方式解决不了问题
  • C#中创建圆形/按钮(使用重绘)

    创建圆形按钮挺简单的 public class EllipseButton Button protected override void OnPaint PaintEventArgs pevent GraphicsPath gPath 61
  • c#中控件重绘(放大缩小移动隐藏恢复后不消失)实例

    很重要 一定要重写并在在OnPaint 中用传入的pevent Graphics重绘 并且屏蔽掉父类的OnPaint方法 这样重绘后的图形不论控件怎么操作都不会消失了 using System using System Collection
  • WM_Paint 消息疑问解析

    1 系统何时发送WM PAINT消息 xff1f 系统会在多个不同的时机发送 WM PAINT 消息 xff1a 当第一次创建一个窗口时 xff0c 当改变窗口的大小时 xff0c 当把窗口从另一个 窗口背后移出时 xff0c 当最大化或最
  • Windows 消息ID及定义大全

    表A 1 Windows消息分布 消息范围 说 明 0 xff5e WM USER 1 系统消息 WM USER xff5e 0x7FFF 自定义窗口类整数消息 WM APP xff5e 0xBFFF 应用程序自定义消息 0xC000 xf
  • C++中消息机制阻塞实验

    VC6标准WIN32程序 xff0c Windows消息处理机制 xff1a 1 在注册窗口类时 xff0c 指定了消息处理函数WndProc 2 WinMain xff08 xff09 里有消息循环 xff1a while GetMess
  • C#中控件如何设置透明色

    设置窗体的TransparencyKey 属性 xff0c 为你想要变成透明的颜色 xff0c 比如 xff1a 你把窗体背景色设置成红色 xff0c 然后把TransparencyKey 设置成红色 xff0c 代码 xff1a this
  • SendMessage消息发送原理与死锁处理

    windows是一个消息驱动的系统 xff0c 也是个多任务调度系统 xff0c windows中的线程分为两类 xff0c GUI线程与Worker线程 xff0c 每个GUI线程会关联消息队列 xff0c 当消息处理顺序不当时 xff0
  • C#中PostMessage和SendMessage的参数传递实例

    用 PostMessage SendNotifyMessage SendMessageCallback 等异步函数发送系统消息时 xff0c 参数里不可以使用指针 xff0c 因为发送者并不等待消息的处理就返回 xff0c 接受者还没处理指
  • WindowsAPI中PostMessage与SendMessage的区别

    xff11 返回值意义的区别 xff0c 先看一下 MSDN 里的声明 xff1a LRESULT SendMessage HWND hWnd UINT Msg WPARAM wParam LPARAM lParam BOOL PostMe