WPARAM和LPARAM参数

时间:2011-06-14 06:20:23

标签: c++ api winapi

将值传递给同时接受WPARAM和LPARAM参数的函数时,我传递给它的是哪个函数是否重要?有人告诉我,如果我使用Windows x64,我应该使用WPARAM;这是真的?

5 个答案:

答案 0 :(得分:22)

发送消息时,WPARAMLPARAM参数具有特定的解释,具体取决于消息。您需要以您发送的消息希望它们传递的方式传递这些参数。如果您要定义自己的消息(可能是通过WM_USERWM_APPRegisterWindowMessage的偏移量),那么您显然会有更多的自由度。

In the days of 16-bit WindowsWPARAM是一个16位字,而LPARAM是32位长。这些区别在Win32中消失了;它们都变成了32位值。

根据thisLPARAM定义为LONG_PTR,在64位Windows中是64位有符号值。 WPARAM定义为UINT_PTR,在64位Windows中是无符号的64位值。如果您要定义自己的消息,则可能需要相应地分配其参数。

答案 1 :(得分:9)

                 | for handles     | for pointers  |
                 | and numbers     |               |
| OS             | WPARAM          | LPARAM        |
|----------------|-----------------|---------------|
| 16-bit Windows | 16-bit unsigned | 32-bit signed |
| 32-bit Windows | 32-bit unsigned | 32-bit signed |
| 64-bit Windows | 64-bit unsigned | 64-bit signed |

多年来,其定义的历史发生了变化。

WINDOWS.H (Windows 2.03 SDK,c.1988)

/* Message structure */
typedef struct tagMSG {
    HWND hwnd;
    WORD message;
    WORD wParam;
    LONG lParam;
    DWORD time;
    POINT pt;
} MSG;

WinDefs.h (c.1999)

/* Types use for passing & returning polymorphic values */
typedef UINT WPARAM;
typedef LONG LPARAM;
typedef LONG LRESULT;

WinDef.h (c.2005)

/* Types use for passing & returning polymorphic values */
typedef UINT_PTR            WPARAM;
typedef LONG_PTR            LPARAM;
typedef LONG_PTR            LRESULT;

奖金阅读

答案 2 :(得分:5)

这是特定于消息的。您可以使用this list of system-defined message categories作为参考。选择一个组,然后从该组中选择一条消息,以查看该消息指定您应该作为WPARAM / LPARAM传递的内容。

Raymond Chen解释why we have two params

答案 3 :(得分:2)

是的,订单很重要。 WPARAM发送/张贴在另一端的WPARAM;同样适用于LPARAM

如果您有自己的自定义消息,则可以使用WPARAMLPARAM获取所需内容。 (但可能有一些共同的惯例。)

答案 4 :(得分:1)

是的,确实如此。我曾经以交换顺序传递它们,我调用的函数失败了。不过,如有疑问,请咨询MSDN。我从来没有在Win64中编程,所以我不知道Win32和Win64在WPARAM / LPARAM行为方面是否存在差异。