zoukankan      html  css  js  c++  java
  • SendMessage和PostMessage区别以及WPARAM 和 LPARAM区别

    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,用于装载函数结果的一个变量

  • 相关阅读:
    Java的静态块与实例块(转)
    Programming Ability Test学习 1031. Hello World for U (20)
    Programming Ability Test学习 1011. World Cup Betting (20)
    Programming Ability Test学习 1027. Colors in Mars (20)
    Programming Ability Test学习 1064. Complete Binary Search Tree (30)
    Programming Ability Test学习 1008. Elevator (20)
    【maven详解-生命周期】Maven的生命周期和插件
    【maven详解-插件】maven插件学习之源码插件Source Xref
    $(document).ready(){}、$(fucntion(){})、(function(){})(jQuery)onload()的区别
    你还没真的努力过,就轻易输给了懒惰
  • 原文地址:https://www.cnblogs.com/skywatcher/p/3506228.html
Copyright © 2011-2022 走看看