将值传递给同时接受WPARAM和LPARAM参数的函数时,我传递给它的是哪个函数是否重要?有人告诉我,如果我使用Windows x64,我应该使用WPARAM;这是真的?
答案 0 :(得分:22)
发送消息时,WPARAM
和LPARAM
参数具有特定的解释,具体取决于消息。您需要以您发送的消息希望它们传递的方式传递这些参数。如果您要定义自己的消息(可能是通过WM_USER
,WM_APP
或RegisterWindowMessage
的偏移量),那么您显然会有更多的自由度。
In the days of 16-bit Windows,WPARAM
是一个16位字,而LPARAM
是32位长。这些区别在Win32中消失了;它们都变成了32位值。
根据this,LPARAM
定义为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;
W
适用于无符号16位WORD
,L
适用于带符号的32位LONG
) 答案 2 :(得分:5)
这是特定于消息的。您可以使用this list of system-defined message categories作为参考。选择一个组,然后从该组中选择一条消息,以查看该消息指定您应该作为WPARAM / LPARAM传递的内容。
Raymond Chen解释why we have two params。
答案 3 :(得分:2)
是的,订单很重要。 WPARAM
发送/张贴在另一端的WPARAM
;同样适用于LPARAM
。
如果您有自己的自定义消息,则可以使用WPARAM
和LPARAM
获取所需内容。 (但可能有一些共同的惯例。)
答案 4 :(得分:1)
是的,确实如此。我曾经以交换顺序传递它们,我调用的函数失败了。不过,如有疑问,请咨询MSDN。我从来没有在Win64中编程,所以我不知道Win32和Win64在WPARAM
/ LPARAM
行为方面是否存在差异。