What are the definitions for LPARAM and WPARAM?
Here:
typedef UINT_PTR WPARAM;
typedef LONG_PTR LPARAM;
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.
MSDN link
These typedefs go back to the 16-bit days. Originally, LPARAM
was a long
(signed 32-bit) and WPARAM
was a WORD
(unsigned 16-bit), hence the W and L. Due to the common practice of passing casted pointers as message parameters, WPARAM
was expanded to 32 bits on Win32, and both LPARAM
and WPARAM
were expanded to 64 bits on Win64.
In C#, you should use IntPtr
for LPARAM
and UIntPtr
for WPARAM.
Note that despite the LP
prefix, LPARAM
is not a far pointer to an ARAM
.
LPARAM refers to a LONG_PTR and WPARAM refers to a UINT_PTR
On x86 they will be 4 bytes and on x64 they will be 8 bytes.