При передаче значения функции, которая принимает как параметр WPARAM, так и параметр LPARAM, имеет значение, на каком из них я его передаю? Кто-то сказал мне, что если я использую Windows x64, я должен использовать WPARAM; Это правда?
Параметры WPARAM и LPARAM
Ответ 1
При отправке сообщений параметры WPARAM
и LPARAM
имеют определенные интерпретации в зависимости от сообщения. Вам необходимо передать эти параметры таким образом, чтобы отправляемое сообщение ожидало их передачи. Если вы определяете свое собственное сообщение (возможно, через смещение от WM_USER
, WM_APP
или RegisterWindowMessage
), то вы, очевидно, немного больше.
В дни 16-разрядной Windows WPARAM
было 16-битным словом, а LPARAM
- 32- бит длинный. Эти различия ушли в Win32; они оба стали 32-битными значениями.
В соответствии с this, LPARAM
определяется как LONG_PTR
, который в 64-битной Windows является подписанным 64-битным значением, WPARAM
определяется как UINT_PTR
, который в 64-разрядной версии Windows представляет собой неподписанное 64-битное значение. Если вы определяете свое собственное сообщение, вы можете соответствующим образом назначить его параметры.
Ответ 2
| 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 (ок. 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 и L в WPARAM и LPARAM? (
W
для 16-разрядногоWORD
без знака, аL
для 32-разрядногоLONG
) - Что происходит с WPARAM, LPARAM и LRESULT, когда они перемещаются между 32-битными и 64-битными окнами? (без знака расширяется нулями, со знаком расширяется)
Ответ 3
Это сообщение специфично. Вы можете использовать этот список системных категорий сообщений в качестве ссылки. Выберите группу, затем сообщение из группы, чтобы узнать, что указывает сообщение, которое вы должны передать как WPARAM/LPARAM.
Раймонд Чен объясняет почему у нас есть два параметра.
Ответ 4
Да, порядок имеет значение. WPARAM
отправлено/отправлено с одной стороны, завершает WPARAM
на другом конце; аналогично для LPARAM
.
Если у вас есть собственные сообщения, вы можете использовать WPARAM
и LPARAM
для чего угодно. (Однако могут быть некоторые общие соглашения.)
Ответ 5
Да, да. Я когда-то передавал их в порядке замены, и функция, которую я вызываю, терпит неудачу. Тем не менее, вы должны проконсультироваться с MSDN, если у вас есть сомнения. Я никогда не программирую в Win64, хотя, я не знаю, существуют ли различия между Win32 и Win64 в отношении поведения WPARAM
/LPARAM
.