精华内容
下载资源
问答
  • 消息中的wParam和lParam

    2019-10-22 09:40:37
    “在Win 3.x中,WPARAM是16位的,而LPARAM是32位的,两者有明显的区别。因为地址通常是32位的,所以LPARAM 被用来传递地址,这个习惯在Win32 API中仍然能够看到。 在Win32 API中,WPARAM和LPARAM都是32位,所以没有...

    具体是这么说:

    “在Win 3.x中,WPARAM是16位的,而LPARAM是32位的,两者有明显的区别。因为地址通常是32位的,所以LPARAM 被用来传递地址,这个习惯在Win32 API中仍然能够看到。

    在Win32 API中,WPARAM和LPARAM都是32位,所以没有什么本质的区 别。


    Windows的消息必须参考帮助文件才能知道具体的含义。如果是你定义的消息,愿意怎么使这两个参数都行。但是习惯上,我们愿意使用LPARAM传 递地址,而WPARAM传递其他参数。”


    在Win32API的早期,为了保证和Win16API的代码可移植性MS定义了WPARAM和LPARAM两个宏。 
    当时保留了w前缀的原因一方面是由于WPARAM宏也已W开头,还有也因为要提醒程序员注意到可移植性,当然到了现在Win16早已退出历史舞台,这个前缀也就约定俗成的沿用下来了。 
    例如:主程序MyDlg.cpp 
    1.自定义消息:#define WM_TRAY WM_USER 100 
    2.函数原形:afx_msg LRESULT OnTrayNotify(WPARAM wParam,LPARAM lParam); 
    3.消息映射:ON_MESSAGE(WM_TRAY,OnTrayNotify) 
    4.原函数: 
    LRESULT CMyDlg::OnTrayNotify(WPARAM wParam,LPARAM lParam) 

    return m_tray.OnTrayNotify(wParam,lParam); 
    }


    WPARAM常常代表一些控件的ID或者高位底位组合起来分别表示鼠标的位置,如果消息的发送者需要将某种结构的指针或者是某种类型的句柄时,习惯上用LPARAM来传递,可以参考各种控件的通知消息:可以查看:EN_CHANGE (EDIT控件的一个通知消息),CBEM_INSERTITEM(可扩展组合框的可接受消息)等等来加以领会。 
    理论上在使用自定义消息时,WPARAM LPARAM的含义可以程序员任意指定的,但是最好遵从MFC中的习惯。在调用SendMessage()函数时,第二个参数是WPARAM,第三个参数是这个消息的LPARAM,但是你在程序中某个类中写下ON_MESSAGE()宏来处理这个消息时,处理函数SomeHandler(WPARAM,LPRAM(默认是0))中解释这两个参数时必须按照SendMessage调用中的意义来进行。 
    消息响应机制 
    1、消息的组成:一个消息由一个消息名称(UINT),和两个参数(WPARAM,LPARAM)。当用户进行了输入或是窗口的状态发生改变时系统都会发送消息到某一个窗口。例如当菜单转中之后会有WM_COMMAND消息发送,WPARAM的高字中(HIWORD(wParam))是命令的ID号,对菜单来讲就是菜单ID。当然用户也可以定义自己的消息名称,也可以利用自定义消息来发送通知和传送数据。 


    2、谁将收到消息:一个消息必须由一个窗口接收。在窗口的过程(WNDPROC)中可以对消息进行分析,对自己感兴趣的消息进行处理。例如你希望对菜单选择进行处理那么你可以定义对WM_COMMAND进行处理的代码,如果希望在窗口中进行图形输出就必须对WM_PAINT进行处理。 


    3、未处理的消息到那里去了:M$为窗口编写了默认的窗口过程,这个窗口过程将负责处理那些你不处理消息。正因为有了这个默认窗口过程我们才可以利用Windows的窗口进行开发而不必过多关注窗口各种消息的处理。例如窗口在被拖动时会有很多消息发送,而我们都可以不予理睬让系统自己去处理。 


    4、窗口句柄:说到消息就不能不说窗口句柄,系统通过窗口句柄来在整个系统中唯一标识一个窗口,发送一个消息时必须指定一个窗口句柄表明该消息由那个窗口接收。而每个窗口都会有自己的窗口过程,所以用户的输入就会被正确的处理。例如有两个窗口共用一个窗口过程代码,你在窗口一上按下鼠标时消息就会通过窗口一的句柄被发送到窗口一而不是窗口二。


    5、示例:下面有一段伪代码演示如何在窗口过程中处理消息 


    LONG yourWndProc(HWND hWnd,UINT uMessageType,WPARAM wP,LPARAM) 

    switch(uMessageType) 
    {//使用SWITCH语句将各种消息分开 
    case(WM_PAINT): 
    doYourWindow(...);//在窗口需要重新绘制时进行输出 
    break; 
    case(WM_LBUTTONDOWN): 
    doYourWork(...);//在鼠标左键被按下时进行处理 
    break; 
    default: 
    callDefaultWndProc(...);//对于其它情况就让系统自己处理 
    break; 


    接下来谈谈什么是消息机制:系统将会维护一个或多个消息队列,所有产生的消息都回被放入或是插入队列中。系统会在队列中取出每一条消息,根据消息的接收句柄而将该消息发送给拥有该窗口的程序的消息循环。每一个运行的程序都有自己的消息循环,在循环中得到属于自己的消息并根据接收窗口的句柄调用相应的窗口过程。而在没有消息时消息循环就将控制权交给系统所以Windows可以同时进行多个任务。下面的伪代码演示了消息循环的用法: 


    while(1) 

    id=getMessage(...); 
    if(id == quit) 
    break; 
    translateMessage(...); 

    当该程序没有消息通知时getMessage就不会返回,也就不会占用系统的CPU时间。


    在Win32 SDK中消息本身是作为一个结构体记录传递给应用程序的,这个记录中包含了消息的类型以及其他信息。这个记录类型叫做MSG,它在window中是这样声明的:


    typedef struct tagMSG { // msg


    HWND hwnd; //窗口句柄


    UINT message; //消息常量标识符


    WPARAM wParam; //32位消息的特定附加信息,具体表示什么取决于message


    LPARAM lParam; //32位消息的特定附加信息,具体表示什么取决于message


    DWORD time; //消息创建时的时间


    POINT pt; //消息创建时的鼠标位置


    } MSG;


    hwnd 接收消息的32位窗口句柄。窗口可以是任何类型的屏幕对象,因为Win32能够维护大多数可视对象的句柄(窗口、对话框、按钮、编辑框等)。


    message 用于区别其他消息的常量值,这些常量可以是Windows单元中预定义的常量,也可以是自定义的常量。


    wParam 通常是一个与消息有关的常量值,也可能是窗口或控件的句柄。 lParam 通常是一个指向内存中数据的指针。由于wParam,lParam和指针都是32位的,需要时可以强制类型转换。具体表示什么,与message相关,他们是事先定义好的。


    如果自定义消息:#define WM_MYMESSAGE WM_USER+100,需确定wParam,lParam的意义 (假设wParam=0时发送数据,wParam=1时接收数据,lParam为CMyClass* 指针,指向一个CMyClass对象,准备要发送的数据或接收数据 发送WM_MYMESSAGE时 SendMessage(hwnd,WM_MYMESSAGE,0,pMyClassObject) 接收消息的窗口,接收WM_MYMESSAGE中(CMyClass*)lParam参数即pMyClassObject传过来的数据


    MFC数据类型WPARAM 窗口函数或callback函数的一个参数


     


    实际上所有的消息响应都有WPARAM和LPARAM的存在,只是有些消息响应WPARAM和LPARAM没有意义,所以在MFC封装后有些固定的消息响应函数看不到WPARAM和LPARAM,但依然可以通过GetCurrentMessage()取得当前的消息来查看WPARAM和LPARAM。


    WPARAM //typedef UINT WPARAM;control identifier
           LPARAM //typedef LONG LPARAM;notification messages


    Windows中的消息由,消息号,字参数(lParam),长字参数(wParam)组成。是包含有关消息的附加信息,随不同的消息有所不同。例如在鼠标消息中参数lParam 包含鼠标光标坐标,wParam包含一个指示各种虚键状态的值(如按下鼠标左键还是右键。。。).


    从消息参数中获取字符串和位置信息存放到子串口类的成员函数中。字符串m_string为什么对应wParam,点m_point对应lParam
    LRESULT CChildView::OnReceive(WPARAM wParam,LPARAM lParam)
    {
       m_string = *((CSring *)wParam);
       m_point = *((CPoint *)lParam);
      Invalidate();
      return 0;


    程序代码*在对话框中取出数据,并向其他窗口发送消息和数据,将数据指针作为一个参数发送*/
    void CTestDlg2::OnCommBtn()
    {
         char szOut[30];
          GetDlgItemText(IDC_OUT,szOut,30);
          m_pParent->SendMessage(WM_DLG_NOTIFY,(WPARAM)szOut);
    }


    /*在消息接收窗口中*/
    /*映射消息处理函数*/
    ON_MESSAGE(WM_DLG_NOTIFY,OnDlgNotifyMsg)


    /*在视图中绘制出字符串 m_szOut*/
    void CMy53_s1View::OnDraw(CDC* pDC)
    {
          CMy53_s1Doc* pDoc = GetDocument();
          ASSERT_VALID(pDoc);
         // TODO: add draw code for native data here
          pDC->TextOut(0,0,"Display String");
          pDC->TextOut(0,20,m_szOut);
    }
    /*处理通知消息,保存信息并更新显示*/
    LONG CMy53_s1View::OnDlgNotifyMsg(WPARAM wP,LPARAM lP)
    {
          m_szOut=(char*)wP;
          Invalidate();
         return 0;
    }


    一个字符串的地址通过WPARAM来标识,再通过Windows消息发送出去;之后在消息处理函数中WPARAM接受到的参数就是该地址,然后就可以对该地址进行操作了~~~


    这是Windows消息机制中经常用到的两个data type

    展开全文
  • windows的消息具有以下两个参数: (1)字参数(wParam) (2)长参数(lParam) 字参数和长参数都是32位整数,用于提供消息的附带消息,是消息传递过程中参数的载体。附加信息的消息号取决于消息号。 一、wParam和...

    windows的消息具有以下两个参数:
      (1)字参数(wParam)
      (2)长参数(lParam)
      字参数和长参数都是32位整数,用于提供消息的附带消息,是消息传递过程中参数的载体。附加信息消息号取决于消息号。

    一、wParam和lParam消息 :部分说明需要查看MSDN

    例如:

    WM_SIZE

    wParam
    Specifies the type of resizing requested. This parameter can be one of the following values.
    SIZE_MAXHIDE
    Message is sent to all pop-up windows when some other window is maximized.
    SIZE_MAXIMIZED
    The window has been maximized.
    SIZE_MAXSHOW
    Message is sent to all pop-up windows when some other window has been restored to its former size.
    SIZE_MINIMIZED
    The window has been minimized.
    SIZE_RESTORED
    The window has been resized, but neither the SIZE_MINIMIZED nor SIZE_MAXIMIZED value applies

    lParamThe low-order word of lParam specifies the new width of the client area.

    The high-order word of lParam specifies the new height of the client area.

     

     1 WM_PAINT消息,LOWORD(lParam)是客户区的宽,HIWORD(lParam)是客户区的高。

     2 滚动条WM_VSCROLL或WM_HSCROLL消息,LOWORD(wParam)指出了鼠标对滚动条的操作。比如上、下、左、右、翻页、移动等。

    3 击键消息,有WM_SYSKEYDOWN、WM_SYSKEYUP、WM_KEYUP、WM_KEYDOWN,其中wParam是虚拟键代码,lParam是包含属于击键的其他信息。lParam消息参数分为6个域,有重复计数、环境代码、键的先前状态等。 

    4 字符消息WM_CHAR、WM_DEADCHAR、WM_SYSCHAR、WM_SYSDEADCHAR,lParam消息参数跟击键消息的lParam消息参数内容相同,wParam参数是ANSI或Unicode字符代码

    5 客户区鼠标消息WM_LBUTTONDOWN、WM_LBUTTONUP、WM_RBUTTONDOWN、WM_RBUTTONUP、WM_MBUTTONDOWN、WM_MBUTTONUP,lParam参数的低位是鼠标的客户区x坐标,高位是客户区y坐标。wParam参数是指示鼠标键及Shift和Ctrl键的状态。wParam&MK_SHIFT或MK_CTRL,如果返回TRUE就意味着有按下Shift或Ctrl键。

    6 非客户区消息,wParam参数指明移动或者单击鼠标键的非客户区位置,以HT开头,lParam参数低位指出了鼠标所在屏幕坐标的x坐标,高位指出了鼠标所在屏幕坐标的y坐标。 

     7 鼠标轮滚动消息,WM_MOUSEWHEEL消息,lParam将获得鼠标的屏幕位置(坐标),wParam参数的低位表明鼠标键和Shift与Ctrl键的状态。wParam高位有一个“delta”值,该值可正可负,指出了滚轮导致屏幕滚动几行,120表示向上3行。 

     8 计时器消息WM_TIMER,wParam参数等于计时器的ID值,lParam为0

     9 按钮子窗口的WM_COMMAND消息,wParam参数的低位是子窗口ID,高位是通知码, lParam参数是子窗口句柄。 

    10 焦点消息,对于正在失去焦点的窗口,会收到WM_KILLFOCUS消息,其wParam参数是即将接收输入焦点的窗口的句柄。对于即将获取焦点的窗口,会收到WM_SETFOCUS消息,其wParam参数是正在失去焦点的窗口的句柄。

    11 编辑控制的WM_COMMAND消息,wParam参数的低位是子窗口ID,高位是通知码, lParam参数是子窗口句柄。

    12 列表框的WM_COMMAND消息,wParam参数的低位是子窗口ID,高位是通知码, lParam参数是子窗口句柄。 

    13 菜单消息1,WM_INITMENU,wParam是主菜单句柄,lParam是0. 

    14 菜单消息2,WM_MENUSELECT,菜单跟踪消息,指针移到菜单的某一些,就会发送这个消息给窗口过程,其wParam参数的低位是选中项菜单的ID或者弹出式菜单的句柄,高位是选择标识,lParam参数是包含选中项的菜单句柄。

    15 菜单消息3,WM_INITMENUPOPUP,准备显示一个弹出式菜单时产生的消息,wParam参数是弹出式菜单的句柄,lParam的低位是弹出式菜单的索引,如果该菜单是系统菜单,那么高位是1,否则为0。 

     16 菜单消息4,WM_COMMAND,选中菜单后产生,wParam低位是击中菜单的ID,高位是0,lParam参数也是0。

     17 菜单消息5,WM_SYSCOMMAND,表示用户从系统菜单中选择一个启用的菜单项,其wParam参数是菜单的ID, lParam为0.如果该消息是由按鼠标产生的,那么lParam参数是鼠标的屏幕坐标。

    18 加速键消息,WM_COMMAND消息,wParam低位是加速键ID,高位是1, lParam是0.

     

     

    消息

    说明

    wParam

    lParam

    WM_PAINT

      

    低位是客户区的宽

    高位是客户区的高

    WM_VSCROLL

    WM_HSCROLL

    窗口滚动条消息

    低位指出了鼠标对滚动条的操作

     
     

    击键消息

    虚拟键代码

    分为6个域,有重复计数、环境代码、键的先前状态等

     

    字符消息

    ANSI或Unicode字符代码

    分为6个域,有重复计数、环境代码、键的先前状态等

     

    客户区鼠标消息

    指示鼠标键及Shift和Ctrl键的状态

    鼠标的客户区坐标

     

    非客户区鼠标消息

    指明移动或者单击鼠标键的非客户区位置,以HT开头

    鼠标的屏幕坐标

    WM_MOUSEWHEEL

    鼠标轮滚动消息

    低位表明鼠标键和Shift与Ctrl键的状态

    高位指出了滚轮导致屏幕滚动几行

    鼠标的屏幕位置

    WM_TIMER

    计时器消息

    计时器的ID值

    0

    WM_COMMAND

    按钮

    低位是子窗口ID,高位是通知码

    子窗口句柄

    WM_SETFOCUS

    焦点消息

    正在失去焦点的窗口的句柄

     

    WM_KILLFOCUS

    焦点消息

    即将接收输入焦点的窗口的句柄

     

    WM_COMMAND

    编辑控制

    低位是子窗口ID,高位是通知码

    子窗口句柄

    WM_COMMAND

    列表框

    低位是子窗口ID,高位是通知码

    子窗口句柄

    WM_INITMENU

     

    主菜单句柄

    0

    WM_MENUSELECT

    菜单跟踪消息

    低位是选中项菜单的ID或者弹出式菜单的句柄,高位是选择标识

    选中项的菜单句柄

    WM_INITMENUPOPUP

    准备显示一个弹出式菜单时产生

    弹出式菜单的句柄

    低位是弹出式菜单的索引,如果该菜单是系统菜单,那么高位是1,否则为0.

     

    WM_COMMAND

    选中菜单后产生

    低位是击中菜单的ID

    高位是0

    0

    WM_SYSCOMMAND

    用户从系统菜单中选择一个启用的菜单项

    菜单的ID

    0如果该消息是由按鼠标产生的,那么是鼠标的屏幕坐标。

    WM_COMMAND 

    加速键消息

    低位是加速键ID

    高位是1

    0

     

     

     

    在Win32中,wParam   lParam是用来传递消息数据的最常用的手段. 
    比如,对按键消息来说,鼠标的X和Y的坐标被压缩进lParam中 
    对MFC来说,消息可以用多样的类型参数来传递,对用户自定义消息 
    来说,只能用wParam和lParam来传递。

    在Win32   SDK中消息本身是作为一个结构体记录传递给应用程序的,这个记录中包含消息的类型以及其他信息。这个记录类型叫做MSG,它在window中是这样声明的: 
    typedef   struct   tagMSG   {           //   msg     
          HWND   hwnd;       //窗口句柄 
          UINT   message;       //消息常量标识符 
          WPARAM   wParam;     //32位消息的特定附加信息,具体表示什么处决于message 
          LPARAM   lParam;     //32位消息的特定附加信息,具体表示什么处决于message 
          DWORD   time;       //消息创建时的时间 
          POINT   pt;               //消息创建时的鼠标位置 
    }   MSG; 
    hwnd   接收消息的32位窗口句柄。窗口可以是任何类型的屏幕对象, 
    因为Win32能够维护大多数可视对象的句柄(窗口、对话框、按钮、编辑框等)。 
    message   用于区别其他消息的常量值,这些常量可以是Windows单元中预定义的常量,也可以是自定义的常量。 
    wParam   通常是一个与消息有关的常量值,也可能是窗口或控件的句柄。 
    lParam   通常是一个指向内存中数据的指针。 
    由于wParam,lParam和指针都是32位的,需要时可以强制类型转换。具体表示什么,与message相关,他们是事先定义好的。 
    如果自定义消息:#define   WM_MYMESSAGE   WM_USER+100,需确定wParam,lParam的意义 
    (假设wParam=0时发送数据,wParam=1时接收数据,lParam为CMyClass*   指针,指向一个CMyClass对象,准备要发送的数据或接收数据 
    发送WM_MYMESSAGE时   SendMessage(hwnd,WM_MYMESSAGE,0,pMyClassObject) 
    接收消息的窗口,接收WM_MYMESSAGE中(CMyClass*)lParam参数即pMyClassObject传过来的数据


    二、应用获取控件的ID

    LOWORD(GetCurrentMessage()->wParam) ===>获得发消息的控件ID值

     

    WORD HIWORD(
        DWORD dwValue
    );
    WORD LOWORD(
        DWORD dwValue
    );

    知网有篇文章也许有用:C++消息参数wParam与lParam的研究

    转载于:https://www.cnblogs.com/xingrun/p/3454787.html

    展开全文
  • wParam和lParam消息

    2012-03-19 21:08:38
    关于MFC中wParam和lParam消息的理解
  • WPARAM和LPARAM的含义

    2018-11-10 18:00:00
    lParam 和 wParam 是宏定义,一般在消息函数中带这两个类型的参数,通常用来存储窗口消息的参数。 LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); wParam 通常用来存储小段信息...

    lParam 和 wParam 是宏定义,一般在消息函数中带这两个类型的参数,通常用来存储窗口消息的参数。
    LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
    wParam 通常用来存储小段信息,如,标志
    lParam 通常用于存储消息所需的对象
    LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
    typedef unsigned int UINT;
    typedef long LONG;
    typedef UINT WPARAM;
    typedef LONG LPARAM;
    lParam 和 wParam 是 Win16 系统遗留下来的产物,在 Win16 API 中 WndProc 有两个参数,一个 WORD 类型的 16 位整型变量,另一个是 LONG 类型的 32 位整型变量。根据匈牙利命名法(Hungarian notation),16 位的变量就被命名为 wParam,而 32 位的变量就被命名为 lParam。
    到了 Win32 API 中,原来的 16 位变量也被扩展为 32 位,因此 lParam 和 wParam 的大小完全相同。在 Win32 API 的早期,为了保证和 Win16 API 的代码兼容,MS 定义了 MPARAM 和 LPARAM 两个宏。保留 w 前缀的原因一方面是由于 WPARAM 宏也以 W 开头,另一方面是希望提醒程序员注意到可移植性。到了现在,Win16 早已退出历史舞台,但是这个前缀仍然约定俗成的沿用了下来。
    the history of WPARAM, LPARAM
    Once upon a time, Windows was 16-bit. Each message could carry with it two pieces of data, called WPARAM and LPARAM. The first one was a 16-bit value (“word”), so it was called W. The second one was a 32-bit value (“long”), so it was called L.
    You used the W parameter to pass things like handles and integers. You used the L parameter to pass pointers.
    When Windows was converted to 32-bit, the WPARAM parameter grew to a 32-bit value as well. So even though the “W” stands for “word”, it isn’t a word any more. (And in 64-bit Windows, both parameters are 64-bit values!)
    It is helpful to understand the origin of the terms. If you look at the design of window messages, you will see that if the message takes a pointer, the pointer is usually passed in the LPARAM, whereas if the message takes a handle or an integer, then it is passed in the WPARAM. (And if a message takes both, the integer goes in the WPARAM and the pointer goes in the LPARAM.)
    “在Win 3.x中,WPARAM是16位的,而LPARAM是32位的,两者有明显的区别。因为地址通常是32位的,所以LPARAM 被用来传递地址,这个习惯在Win32 API中仍然能够看到。在Win32 API中,WPARAM和LPARAM都是32位,所以没有什么本质的区 别。Windows的消息必须参考帮助文件才能知道具体的含义。如果是你定义的消息,愿意怎么使这两个参数都行。但是习惯上,我们愿意使用LPARAM传 递地址,而WPARAM传递其他参数。”
    在 MSDN 网站中关于 Windows Data Types 中有如下定义:
    LPARAM: A message parameter. This type is declared in WinDef.h as follows: typedef LONG_PTR LPARAM;
    WPARAM: A message parameter. This type is declared in WinDef.h as follows: typedef UINT_PTR WPARAM;
    LPARAM is a typedef for LONG_PTR which is a long (signed 32-bit) on win32 and __int64 (signed 64-bit) on x86_64.
    WPARAM is a typedef for UINT_PTR which is an unsigned int (unsigned 32-bit) on win32 and unsigned __int64 (unsigned 64-bit) on x86_64
    (x86_64 is how Microsoft now refer to amd64)
    In c#, you should use IntPtr for LPARAM and UIntPtr for WPARAM.
    在 C# 与 C++ 的互操作中,可以使用 IntPtr 来声明 LPARAM 类型变量,使用 UIntPtr 来声明 WPARAM 类型的变量。
    当 WPARAM, LPARAM 和 LRESULT 在 32 位和 64 位 Windows 系统中传递的时候会发生什么?
    如果是从 64 位 Windows 系统到 32 位系统,那么只有一个选择:截断 truncation。
    如果是从 32 位到 64 位,那么对 WPARAM 采用补零扩展(zero-extended),对 LPARAM 和 LRESULT 采用符号扩展 (sign-extended)。
    扩展方式不同的原因主要是因为 WPARAM 被定义为 “字 (WORD)” 也就是 “UINT_PTR”,而 LPARAM 和 LRESULT 被定义为 “LONG”,也就是 “LONG_PTR”。
    What happens to WPARAM, LPARAM, and LRESULT when the travel between 32-bit and 64-bit windows?
    The integral types WPARAM, LPARAM, and LRESULT are 32 bits wide on 32-bit systems and 64 bits on 64-bit systems. What happens when a 32-bit process sends a message to a 64-bit window or vice versa ?
    There’s really only one choice when converting a 64-bit value to a 32-bit value: Truncation. When a 64-bit process sends a message to a 32-bit window, the 64-bit WPARAM and LPARAM values are truncated to 32 bits. Similarly, when a 64-bit window returns an LRESULT back to a 32-bit sender, the value is truncate.
    But converting a 32-bit value to a 64-bit value includes a choice: Do you zero-extend or sign-extend?
    The answer is obvious if you remember the history of WPARAM, LPARAM, and LRESULT or if you just look at the header file.
    The WPARAM is zero-extend, while LPARAM and LRESULT are sign-extended.
    If you remember that WPARAM used to be a WORD and LPARAM and LRESULT used to be LONG, then this follows from the fact that WORD is an unsigned type (therefore zero-extended) and LONG is a signed type (therefore sign-extend).
    Even if you didn’t know that, you could look it up in the header file.
    typedef UINT_PTR WPARAM;
    typedef LONG_PTR LPARAM;
    typedef LONG_PTR LRESULT;
    UINT_PTR is an unsigned type (therefore zero-extended) and LONG_PTR is a signed type (therefore sign-extended).

    具体的消息表示

    1. WM_PAINT消息,LOWORD(lParam)是客户区的宽,HIWORD(lParam)是客户区的高

    2. 滚动条WM_VSCROLL或WM_HSCROLL消息,LOWORD(wParam)指出了鼠标对滚动条的操作。比如上、下、左、右、翻页、移动等。

    3. 击键消息,有WM_SYSKEYDOWN、WM_SYSKEYUP、WM_KEYUP、WM_KEYDOWN,其中wParam是虚拟键代码,lParam是包含属于击键的其他信息。lParam消息参数分为6个域,有重复计数、环境代码、键的先前状态等。4. 字符消息WM_CHAR、WM_DEADCHAR、WM_SYSCHAR、WM_SYSDEADCHAR,lParam消息参数跟击键消息的lParam 消息参数内容相同,wParam参数是ANSI或Unicode字符代码

    4. 客户区鼠标消息WM_LBUTTONDOWN、WM_LBUTTONUP、WM_RBUTTONDOWN、WM_RBUTTONUP、 WM_MBUTTONDOWN、WM_MBUTTONUP,lParam参数的低位是鼠标的客户区x坐标,高位是客户区y坐标。wParam参数是指示鼠标键及Shift和Ctrl键的状态。wParam&MK_SHIFT或MK_CTRL,如果返回TRUE就意味着有按下Shift或Ctrl 键。

    5. 非客户区消息,wParam参数指明移动或者单击鼠标键的非客户区位置,以HT开头,lParam参数低位指出了鼠标所在屏幕坐标的x坐标,高位指出了鼠标所在屏幕坐标的y坐标。

    6. 鼠标轮滚动消息,WM_MOUSEWHEEL消息,lParam将获得鼠标的屏幕位置(坐标),wParam参数的低位表明鼠标键和Shift与Ctrl 键的状态。wParam高位有一个“delta”值,该值可正可负,指出了滚轮导致屏幕滚动几行,120表示向上3行。

    7. 计时器消息WM_TIMER,wParam参数等于计时器的ID值,lParam为0

    8. 按钮子窗口的WM_COMMAND消息,wParam参数的低位是子窗口ID,高位是通知码, lParam参数是接收消息的子窗口的句柄。

    9. 焦点消息,对于正在失去焦点的窗口,会收到WM_KILLFOCUS消息,其wParam参数是即将接收输入焦点的窗口的句柄。对于即将获取焦点的窗口,会收到WM_SETFOCUS消息,其wParam参数是正在失去焦点的窗口的句柄。11. 编辑控制的WM_COMMAND消息,wParam参数的低位是子窗口ID,高位是通知码, lParam参数是子窗口句柄。12. 列表框的WM_COMMAND消息,wParam参数的低位是子窗口ID,高位是通知码, lParam参数是子窗口句柄。13. 菜单消息1,WM_INITMENU,wParam是主菜单句柄,lParam是0.

    10. 菜单消息2,WM_MENUSELECT,菜单跟踪消息,指针移到菜单的某一些,就会发送这个消息给窗口过程,其wParam参数的低位是选中项菜单的 ID或者弹出式菜单的句柄,高位是选择标识,lParam参数是包含选中项的菜单句柄。

    11. 菜单消息3,WM_INITMENUPOPUP,准备显示一个弹出式菜单时产生的消息,wParam参数是弹出式菜单的句柄,lParam的低位是弹出式菜单的索引,如果该菜单是系统菜单,那么高位是1,否则为0.

    12. 菜单消息4,WM_COMMAND,选中菜单后产生,wParam低位是击中菜单的ID,高位是0,lParam参数也是0

    13. 菜单消息5,WM_SYSCOMMAND,表示用户从系统菜单中选择一个启用的菜单项,其wParam参数是菜单的ID, lParam为0.如果该消息是由按鼠标产生的,那么lParam参数是鼠标的屏幕坐标。

    14. 加速键消息,WM_COMMAND消息,wParam低位是加速键ID,高位是1, lParam是0.

    19.控制项着色消息,WM_CTLCOLORBTN消息,wParam是按钮的设备描述表句柄,lParam是按钮的窗口句柄。

    转载于:https://www.cnblogs.com/asdyzh/p/9940129.html

    展开全文
  • Windows程序设计参数wParam和lParam消息的含义
  • WPARAM和LPARAM

    2019-05-07 23:37:11
    wParam和lParam这两个是Win16系统遗留下来的产物,在Win16API中WndProc有两个参数:一个是WORD类型的16位整型变量;另一个是LONG类型的32位整型变量。 因此根据匈牙利命名法,16位的变量就被命名为wParam, 32位的...

    wParamlParam这两个是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调用中的意义来进行。

    展开全文
  • 问题发现在以下这段代码中,在32位windows7上用DEV-C++编译,无错无警告通过;...LRESULT CALLBACK WndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam) { static int i=0; static HWND bH
  • LOWORD(wParam)指出了鼠标对滚动条的操作。比如上、下、左、右、翻页、移动等。 03、击键消息,有WM_SYSKEYDOWN、WM_SYSKEYUP、WM_KEYUP、WM_KEYDOWN wParam是虚拟键代码,lParam是包含属于击键的其他信息。...
  • /* Types use for passing & returning polymorphic values */ typedef UINT_PTR WPARAM; typedef LONG_PTR LPARAM; typedef LONG_PTR LRESULT; //指针就是一个大整数 整数有short 16位2字节整...
  • wparam , lparam 传递消息

    2019-09-24 21:24:00
    01、WM_PAINT消息 LOWORD(lParam)是客户区的宽,HIWORD...LOWORD(wParam)指出了鼠标对滚动条的操作。比如上、下、左、右、翻页、移动等。 03、击键消息,有WM_SYSKEYDOWN、WM_SYSKEYUP、WM_KEYUP、WM_KEYDOWN...
  • (1)字参数(wParam) (2)长参数(lParam)  字参数和长参数都是32位整数,用于提供消息的附带消息,是消息传递过程中参数的载体。附加信息的消息号取决于消息号。 一、wParam和lParam消息 :部分说明需要查看MSDN 例如...
  • 在调用SendMessage()函数时,第二个参数是WPARAM,第三个参数是这个消息的LPARAM,但是你在程序中某个类中写下ON_MESSAGE()宏来处理这个消息时,处理函数SomeHandler(WPARAM,LPRAM(默认是0))中解释这两个参数时必须...
  • 在Win32中,(wParam ,lParam)是用来传递消息数据的最常用的手段.比如, 对按键消息来说,鼠标的X和Y的坐标被压缩进lParam中 。 对MFC来说,消息可以用多样的类型参数来传递。 对用户自定义消息来说,只能用wParam和...
  • LRESULT 、WPARAM 和 LPARAM

    2019-09-26 15:48:56
    对消息的处理中我们经常需要将WPARAM或LPARAM等32位数据(DWORD)分解成两个16位数据(WORD),例如: LPARAM lParam; WORD loValue = LOWORD(lParam);///取低16位 WORD hiValue = HIWORD(lParam);///取高16位 对于16位的...
  • 01、WM_PAINT消息 LOWORD(lParam)是客户区的宽,HIWORD(lParam)是客户区的高 02、滚动条WM_VSCROLL或WM_HSCROLL消息 LOWORD(wParam)指出了鼠标对滚动条的操作。比如上、下、左、右、翻页、移动等...wParam是虚拟...
  • 各种消息下wParam及lParam值的含义 01、WM_PAINT消息 LOWORD(lParam)是客户区的宽,HIWORD(lParam)是客户区的高 02、滚动条WM_VSCROLL或WM_HSCROLL消息 LOWORD(wParam)指出了鼠标对滚动条的操作。比如上、下、左...
  • var wParam = (int)msg.WParam; 工作得很好。 在X64的环境下, 快速滚动滚轮会出现msg.WParam 转换为int的时候溢出,(WParam=4263510016)。 信息为: 未处理System.OverflowException Message=算术运算导致溢出。...
  • wParam和lParam消息.doc

    2012-04-08 12:31:29
    各种WM消息下对应的wParam和lParam消息总结.非常不错!!!
  • http://blog.csdn.net/ljd_1986413/article/details/6258604原文地址 第一:WPARAM 和 LPARAM 是什么东西  typedef uint wparam;//就是无符号整形  typedef long lparam;//就是长整形  typedef struct ta
  • LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { //处理感兴趣的消息 switch (message) { case WM_DESTROY: //当用户关闭窗口,窗口销毁,程序需结束,发退出消息,...
  • LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { //处理感兴趣的消息 switch (message) { case WM_DESTROY: //当用户关闭窗口,窗口销毁,程序需结束,发退出消息,...
  • lParam 和 wParam

    千次阅读 2013-11-04 09:50:04
    lParam 和 wParam 是宏定义,一般在消息函数中带这两个类型的参数,通常用来存储窗口消息的参数。 LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);  wParam 通常用来存储小...
  • WPARAM

    2015-04-17 17:01:44
    WPARAM,消息响应机制 wParam和lParam 这两个是Win16系统遗留下来的产物,在Win16API中WndProc有两个参数: 一个是WORD类型的16位整型变量;另一个是LONG类型的32位整型变量。因此根据匈牙利命名法,16位的变量就被...
  •  static LRESULT CALLBACK wndProc(HWND hWnd, UINT msgId, WPARAM wParam, LPARAM lParam) msgId标识消息,与wParam、lParam三者共同描述消息信息 以下内容转自:...
  • Wparam与Lparam的区别

    万次阅读 2014-09-29 16:04:12
    在Win32 SDK中消息本身是作为一个结构体记录传递给应用程序的,这个记录中包含了消息的类型以及其他信息。这个记录类型叫做MSG,它在window中是这样声明的: ...WPARAM wParam; //32位消息的特定附加信息,具体表示什么
  • 在写消息处理函数时,常会遇到WPARAM与LPARAM这两个参数,这两个参数都是DWORD类型的,也就是双字或四字节或32位长度的。有时想取这些参数里的高位字或低位字,用什么方法呢?查MSDN说有两个宏函数可用: 取高位字...
  • C# SendMessage WPARAM大全 (收集)

    千次阅读 2017-10-29 12:48:23
    原文地址:http://www.cnblogs.com/wuhenke/archive/2011/05/06/2039504.html
  • ((short)(wParam>>16)) 2.为了获得最大的清晰,我会定义一组这样的函数: internal static class NativeMethods { internal static ushort HIWORD(IntPtr dwValue) { return (ushort)((((long)...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 74,058
精华内容 29,623
关键字:

wparam