Параметры WPARAM и LPARAM

При передаче значения функции, которая принимает как параметр WPARAM, так и параметр LPARAM, имеет значение, на каком из них я его передаю? Кто-то сказал мне, что если я использую Windows x64, я должен использовать WPARAM; Это правда?

Ответ 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;

Чтение бонусов

Ответ 3

Это сообщение специфично. Вы можете использовать этот список системных категорий сообщений в качестве ссылки. Выберите группу, затем сообщение из группы, чтобы узнать, что указывает сообщение, которое вы должны передать как WPARAM/LPARAM.

Раймонд Чен объясняет почему у нас есть два параметра.

Ответ 4

Да, порядок имеет значение. WPARAM отправлено/отправлено с одной стороны, завершает WPARAM на другом конце; аналогично для LPARAM.

Если у вас есть собственные сообщения, вы можете использовать WPARAM и LPARAM для чего угодно. (Однако могут быть некоторые общие соглашения.)

Ответ 5

Да, да. Я когда-то передавал их в порядке замены, и функция, которую я вызываю, терпит неудачу. Тем не менее, вы должны проконсультироваться с MSDN, если у вас есть сомнения. Я никогда не программирую в Win64, хотя, я не знаю, существуют ли различия между Win32 и Win64 в отношении поведения WPARAM/LPARAM.