Win32 API消息函数:SendMessage

函数功能:该函数将指定的消息发送到一个或多个窗口。此函数为指定的窗口调用窗口程序,直到窗口程 序处理完消息再返回。而函数PostMessage不同,将一个消息寄送到一个线程的消息队列后立即返回。

函数原型:LRESULT SendMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM IParam);

参数:

hWnd:其窗口程序将接收消息的窗口的句柄。如果此参数为HWND_BROADCAST,则消息将被发送到系统中所有顶层窗口,包括无效或不可见的非自 身拥有的窗口、被覆盖的窗口和弹出式窗口,但消息不被发送到子窗口。

Msg:指定被发送的消息。

wParam:指定附加的消息指定信息。

IParam:指定附加的消息指定信息。

返回值:返回值指定消息处理的结果,依赖于所发送的消息。

备注:需要用HWND_BROADCAST通信的应用程序应当使用函数RegisterWindowMessage来为应用程序间的通信取得一个唯一的消 息。

如果指定的窗口是由调用线程创建的,则窗口程序立即作为子程序调用。如果指定的窗口是由不同线程创建的,则系统切换到该线程并调用恰当的窗口程序。线程间 的消息只有在线程执行消息检索代码时才被处理。发送线程被阻塞直到接收线程处理完消息为止。

Windows CE:Windows CE不支持Windows桌面平台支持的所有消息。使用SendMesssge之前,要检查发送的消息是否被支持。

速查:Windows NT:3.1及以上版本:Windows:95及以上版本;Windows CE:1.0及以上版本;头文件:winuser.h;输入库:user32.lib;Unicode:在Windows NT环境下以Unicode和ANSI方式实现。

Win32 API消息函数:PostMessage

函数功能:该函数将一个消息放入(寄送)到与指定窗口创建的线程相联系消息队列里,不等待线程处理消息就返回。消息队列里的消息通过调用 GetMessage和PeekMessage取得。

函数原型:B00L PostMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam);

参数

hWnd:其窗口程序接收消息的窗口的句柄。可取有特定含义的两个值:

HWND.BROADCAST:消息被寄送到系统的所有顶层窗口,包括无效或不可见的非自身拥有的窗口、被覆盖的窗口和弹出式窗口。消息不被寄送到子窗 口。

NULL:此函数的操作和调用参数dwThread设置为当前线程的标识符PostThreadMessage函数一样。

Msg:指定被寄送的消息。

wParam:指定附加的消息特定的信息。

IParam:指定附加的消息特定的信息。

返回值:如果函数调用成功,返回非零值:如果函数调用失败,返回值是零。若想获得更多的错误信息,请调用GetLastError函数。

备注:需要以 HWND_BROADCAST方式通信的应用程序应当用函数 RegisterwindwosMessage来获得应用程序间通信的独特的消息。

如果发送一个低于WM_USER范围的消息给异步消息函数 (PostMessage.SendNotifyMessage,SendMesssgeCallback),消息参数不能包含指针。否则,操作将会失 败。函数将再接收线程处理消息之前返回,发送者将在内存被使用之前释放。

速查:Windows NT: 3.1及以上版本;Windows:95及以上版本;Windows CE:1.0及以上版本;头文件:winuser.h;输入库:user32.lib;Unicode:在Windows NT环境下以Unicode和ANSI方式实现。

在控制别的应用程序的时候,经常需要等待直到某个功能结束,例如:
打开一个窗口-->等待直到窗口结束
这 个时候就可以用到SendMessage
如果在打开这个窗口后仍然需要对该窗口的界面进行设置,比如Edit的value等等,比如:
打 开一个窗口-->控制窗口的control的属性
这个时候就需要PostMessage

使用一个钩子程序截获消息后,使用 SendMessage把消息发送到主处理程序进行处理,但是在主处理程序还没有完成任务的时候,被设置钩子的程序进入了停止的状态,不可以处理
WM_PAINT,
WM_MOVE,
....... 等的基本信息,
必须要等SendMessage发送出的消息完成后,才能继续运行,整个界面一片空白,把钩子消息设置成PostMessage的 发送消息形式后,问题解决!
我查了MSDN对这两个API的定义,
PostMessage只是把消息放入队列,不管其他程序是否处理都返 回,然后继续执行;
而SendMessage必须等待其他程序处理消息后才返回,继续执行。
PostMessage的返回值表示 PostMessage函数执行是否正确;
而SendMessage的返回值表示其他程序处理消息后的返回值。
使用这两个发送消息函数 的最重要的是要看你的程序是否要对消息的滞后性关注否,PostMessage会造成消息的滞后性,而SendMessage则不会,但如果 SendMessage消息处理失败,则会造成程序停止!

===============================================

1. SendMessage函数要等到消息被处理后才返回

PostMessage 消息发出后马上返回

2. PostMessage发向目标窗口的消息一定会进入消息队列

SendMessage向同一线程的窗口发消息,不会进入消息队列,

SendMessage向其他线程的窗口发消息,则会进入消息队列,

3. PostMessage的返回值表示PostMessage函数执行是否正确,

SendMessage的返回值表示其他程序处理消息后的返回值

1、SendMessage()和PostMessage().这两个函数几乎是一样的,它们的区别是:

SendMessage()直接把一个消息发给窗口过程,等消息被处理后才返回。Postmessage()只是把消息发送到消息队列,完成后即返回。

2.1、当调用SendMessage时,接收消息的线程的QS_SENDMESSAGE标志被设置,系统调用相应的窗口过程来处理这个消息。 GetMessage和PeekMessage函数在内部进行这种处理。如果在“发送消息队列”中没有消息了,QS_SENDMESSAGE标志就被关 闭。“发送消息队列”中可能有几个Send过来的消息。例如,几个线程同时向一个窗口发送消息。

2.2、当调用PostMessage时,函数GetMessage或PeekMessage填充传递给它们的Msg结构,函数返回。再调用 DispatchMessage,让相应的窗口过程来处理消息。

2.3、当调用SendMessage时,发送线程和接收线程是同一个线程的时候,SendMessag很简单,只是调用指定窗口的窗口过程。但当 发送线程和接收线程不是同一个线程时,麻烦就大了。因为发送线程和接收线程运行在不同的地址空间中,因此不能访问接受线程中相应窗口过程的代码和数据。其 实这时发送线程要挂起,当接收线程处理Send过来的消息时,发送线程被设置为空闲(idle)状态。在发送的消息处理完成后,窗口过程的返回值被登记到 发送线程的应答消息队列中。发送线程被唤醒,取出包含在应答消息队列中的返回值。这个返回值就是调用SendMessage的返回值,这时,发送线程继续 运行。

2.4、WM_PAINT和WM_TIMER这两个消息的优先级非常低,最低的是WM_TIMER。

2.5、WM_COPYDATA只能Send,不能Post。

SendMessage 和 PostMessage相关推荐

  1. SendMessage、PostMessage原理

    SendMessage.PostMessage原理 本文讲解SendMessage.PostMessage两个函数的实现原理,分为三个步骤进行讲解,分别适合初级.中级.高级程序员进行理解,三个步骤分别 ...

  2. SendMessage和PostMessage

    SendMessage 和 PostMessage 的区别 1.首先是返回值意义的区别,我们先看一下 MSDN 里的声明: LRESULT SendMessage(         HWND hWnd ...

  3. SendMessage、PostMessage原理和源代码详解

    本文讲解SendMessage.PostMessage两个函数的实现原理,分为三个步骤进行讲解,分别适合初级.中级.高级程序员进行理解,三个步骤分别为: 1.SendMessage.PostMessa ...

  4. Windows SendMessage和PostMessage区别(最简单的讲解)

    SendMessage和PostMessage共同点: 都是向其他进程或本进程传递消息,消息是Windows处理机制的灵魂,这个消息就不详解了,大家可以百度一下看一下,很重要在Windows开发当中. ...

  5. Windows API 函数SendMessage与PostMessage使用方法和常见的坑

    Windows API 函数中 SendMessage 与 PostMessage 用处很大,经常被程序员们使用.对老手们来说,了如知掌,但对新手来说,可能会遇到这样那样的问题.我作为一名老手中的新手 ...

  6. Window SendMessage,PostMessage分析

    Window SendMessage,PostMessage分析 背景 SendMessage 函数原型 PostMessage 函数原型 区别 问题解决 背景 前段时间程序中突然出现一个Bug,程序 ...

  7. SendMessage、PostMessage 2021-01-07

    本文讲解SendMessage.PostMessage两个函数的实现原理,分为三个步骤进行讲解,分别适合初级.中级.高级程序员进行理解,三个步骤分别为: 1.SendMessage.PostMessa ...

  8. 在C#中SendMessage和PostMessage的参数传递

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

  9. sendmessage和postmessage的区别

    1.POSTMESSAGE(非阻塞)与SENDMESSAGE(阻塞) 区别1:返回时间不同 PostMessage发送消息后就立即返回 SendMessage发送消息后,等待消息处理函数处理完后才返回 ...

最新文章

  1. 总结一下MySQL中的锁机制
  2. 2560x1600分辨率高吗_手机屏幕分辨率真的越高越好?它的好处和坏处你知道吗?...
  3. java变量初始化0.00
  4. 企业面试题库_数据库部分
  5. Matlab R2010a 32bit 绿色免安装版
  6. 改2003远程端口3389的方法!
  7. C语言 select
  8. 【数据处理】——利用Excel VBA批量将详细地址转换成省市区三级行政区划
  9. 【转载】学习可能用到的英语单词
  10. SpringCloud OpenFeign调用第三方服务
  11. C++函数参数的缺省值
  12. 项目采购管理和干系人管理
  13. Json简介与基本使用
  14. 拉伯证券|社会消费复苏将是2023年主旋律
  15. day12_XML解析
  16. 本地搭建xxl-job服务及连接验证
  17. 【语音算法】使用端点检测和百度语音识别技术实现视频的字幕生成
  18. 直面顾客不满:坏消息也可以是好消息
  19. android svg路径动画,Svg 路径动画实现旋转进度条
  20. AutoHotkey中的变量名 全局与局部冲突问题 - double-ref 双重引用

热门文章

  1. 北京尚学堂|程序员励志名言
  2. 【Hibernate步步为营】--双向关联一对一映射具体解释(一)
  3. Mysql Explain 结果字段解释
  4. 6-java代码片段
  5. addslashes 及 其他 清除空格的方法是不安全的
  6. 增大apache 2的最大连接数
  7. NetCore TagHelpers标签
  8. 如何理解高光谱图像数据
  9. 前端学HTTP之网关、隧道和中继
  10. Ubuntu 16 安装ElasticSearch