WPARAM 和 LPARAM

  wParam和lParam 这两个是Win16系统遗留下来的产物,在Win16API中WndProc有两个参数:一个是WORD类型的16位整型变量;另一个是LONG类型的32位整型变量。

因此根据匈牙利命名法,16位的变量就被命名为wParam, 32位的变量就被命名为lParam。

  而到了Win32API中,原来的16位变量也被扩展为32位,因此此时wParam和lParam的大小完全相同。

  区别及习惯用法:

  MS在使用时两种参数分别代表不同的含义和内容,WPARAM常常代表一些控件的ID或者高位低位组合起来分别表示鼠标的位置,如果消息的发送者需要将某种结构的指针或者是某种类型的句柄时,习惯上用LPARAM来传递。除此之外,一般我们使用LPARAM传递地址,而WPARAM传递其他参数。

  在自定义消息中调用SendMessage()函数时,第二个参数是WPARAM,第三个参数是这个消息的LPARAM,但是你在程序中某个类中写下ON_MESSAGE()宏来处理这个消息时,处理函数SomeHandler(WPARAM,LPRAM(默认是0))中解释这两个参数时必须按照SendMessage调用中的意义来进行。

 

SendMessage和PostMessage:

  SendMessage:调用系统的消息处理函数对发送的消息进行处理,等待消息处理完成,该函数返回。

  PostMessage:将需要处理的消息发送到系统消息处理队列中,然后返回。系统会将插入的消息当一般消息来处理。

  详情:SendMessage、PostMessage原理

  SendMessage缺点:

  如果在线程中使用了SendMessage,在对话框主线程中发出了结束该线程的消息(比如SetEvent),然后WaitForSingleObject等待该线程退出。这时对话框线程已被阻塞在这里等待线程退出。同时,线程内由于使用了SendMessage也在等待主线程接收消息后返回。这时,两边都在等待,程序就“死锁”了,永远也退出不了了。

  PostMessage缺点:

  PostMessage中传递字符串指针时要注意,一般在SendMessage中不出错,换到PostMessage中就出现内存错误了,那是因为SendMessage会等待消息返回,也就是目标线程收到消息时,该字符串仍存在。但是PostMessage就不一定了,可能目标线程收到消息时,字符串已经被销毁了。

引用:线程中慎用SendMessage和PostMessage

  SendMessageTimeout:

  向窗口发送一条消息。如窗口位于不同的线程中,则利用这个函数可以指定一个超时值,以便在另一个进程挂起的时候防止调用进程也永远挂起。该函数将指定的消息发送到一个或多个窗口。此函数为指定的窗口调用窗口程序,并且,如果指定的窗口属于不同的线程,直到窗口程序处理完消息或指定的超时周期结束函数才返回。如果接收消息的窗口和当前线程属于同一个队列,窗口程序立即调用,超时值无用。

  针对以上两个函数的缺点,使用SendMessageTimeout是一个相对折中的办法。但是具体情况是还是看需求是偏重与哪一方面而具体选择。

  函数原型:

LRESULT SendMessageTimeout(HWND hwnd,UINT Msg,WPARAM wParam,LPARAM IParam,UINTfuFlags,UIUT uTimeout,LPDWORD lpdwResultult)

  参数 类型及说明:

hwnd Long,要接收消息的一个窗口的句柄 
msg Long,消息的标识符 
wParam Long,由消息决定 
lParam Long,由消息决定 
fuFlags Long,下述常数的一个或多个 
  SMTO_ABORTIFHUNG 如目标进程挂起,则函数立即返回 
  SMTO_BLOCK 除非函数返回,否则调用线程不能处理消息 
  SMTO_NORMAL 允许调用线程处理消息,同时保持函数继续执行 
uTimeout Long,超时值,采用毫秒为单位 
lpdwResult Long,用于装载函数结果的一个变量

SendMessage和PostMessage区别以及WPARAM 和 LPARAM区别的更多相关文章

  1. wParam与lParam的区别

    wParam与lParam的区别 lParam 和 wParam 是宏定义,一般在消息函数中带这两个类型的参数,通常用来存储窗口消息的参数. LRESULT CALLBACK WindowProc(H ...

  2. SendMessage()、WPARAM、LPARAM函数使用例子(转)

      http://chujiaba.blog.163.com/blog/static/18991813720106209350592/ 2010-07-20 21:35:00|  分类: C |  标 ...

  3. SENDMESSAGE和POSTMESSAGE

    原文:http://www.cnblogs.com/wind-net/archive/2012/11/01/2750123.html SendMessage 和 PostMessage 的区别 1.首 ...

  4. (转)深入解析SendMessage、PostMessage

        转自:http://blog.csdn.net/xt_xiaotian/article/details/2778689 本文将使用C++语言,在MFC框架的配合下给出PostMessage.S ...

  5. SendMessage 和 PostMessage

    1.首先是返回值意义的区别,我们先看一下 MSDN 里的声明: LRESULT SendMessage( HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lPar ...

  6. [转] - SendMessage、PostMessage原理

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

  7. LRESULT与wParam和lParam的问题

    在微软vc提供的头文件中有定义在winnt.h中typedef long LONG;在windef.h中typedef LONG LRESULT; 所以LRESULT就是long,也就是长整形之所以取 ...

  8. SendMessage、PostMessage原理

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

  9. 自定义消息中如果需要定义WPARAM和LPARAM,该怎么使用和分配?

    写Windows程序不可避免要使用自定义的消息,也就是从WM_USER开始定义的消息.在定义一个消息后,往往我们还要定义针对该消息的WPARAM甚至是LPARAM.WPARAM和LPARAM是什么,可 ...

随机推荐

  1. Codeforces 231E - Cactus

    231E - Cactus 给一个10^5个点的无向图,每个点最多属于一个环,规定两点之间的简单路:从起点到终点,经过的边不重复 给10^5个询问,每个询问两个点,问这两个点之间有多少条简单路. 挺综 ...

  2. 解决win service 2003 IIS发布Gis网站后,访问地图服务出错,无法正常打开而且 事件查看器出现错误提示。

    错误详情: 应用程序-特定 权限设置未将 COM 服务器应用程序(CLSID 为{379376DB-AEA6-40D1-9491-9345E61EF6BE})的 本地 激活 权限授予用户 NT AUT ...

  3. 佳博GprinterApp编辑软件使用说明

    佳博打印机代理商淘宝店https://shop107172033.taobao.com/index.htm?spm=2013.1.w5002-9520741823.2.Sqz8Pf 在此店购买的打印机 ...

  4. vpn的作用

    1.可以用于远程对方桌面. 步骤: 1.浏览器中访问网址,输入用户名,密码即可 2.输入远程桌面用户名和网址

  5. JavaScript Array(数组) 对象

    更多实例 合并两个数组 - concat() 合并三个数组 - concat() 用数组的元素组成字符串 - join() 删除数组的最后一个元素 - pop() 数组的末尾添加新的元素 - push ...

  6. 百度地图API地址转换成经纬度

    public class LngAndLatUtil { public static Map<String,Double> getLngAndLat(String address){ Ma ...

  7. hdoj 1087 (DP)

    代码: #include<iostream>   #include<cmath>   using namespace std;  int a[1005], dp[1005];  ...

  8. X-Plane数据交互

    要用X-Plane进行二次开发,免不了需要进行参数的传递,下面我们来看看与X-Plane进行数据交互都有哪些方式. 与FSX和Flightgear基本一样,X-Plane支持插件,自然也支持通过插件进 ...

  9. OSG 安装配置

    对于普通用户推荐直接下载安装包配置.如有特殊需求或想了解编译过程可参考网上文章自己编译后配置.(通常建议使用第一种方法即可) 本人安装经验: 失败:自己系统64位,VS2010 32位,开始自己动手编 ...

  10. 每天一条linux命令——login

    login命令用于给出登录界面,可用于重新登录或者切换用户身份,也可通过它的功能随时更换登入身份.当/etc/nologin文件存在时,系统只root帐号登入系统,其他用户一律不准登入. 语法: lo ...