Параметры WPARAM и LPARAM - PullRequest
       20

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

11 голосов
/ 14 июня 2011

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

Ответы [ 5 ]

24 голосов
/ 14 июня 2011

При отправке сообщений параметры WPARAM и LPARAM имеют определенные интерпретации в зависимости от сообщения.Вам нужно передать эти параметры так, чтобы сообщение, которое вы отправляете, ожидало их передачи.Если вы определяете свое собственное сообщение (возможно, через смещение от WM_USER, WM_APP или RegisterWindowMessage), то, очевидно, у вас естьнемного больше широты.

Во времена 16-битной Windows , WPARAM было 16-битным словом, в то время как LPARAM было 32-битной длиной.Эти различия исчезли в Win32;они оба стали 32-битными значениями.

Согласно это , LPARAM определяется как LONG_PTR, что в 64-битной Windows является 64-битным значением со знаком.WPARAM определяется как UINT_PTR, что в 64-битной Windows является 64-битным значением без знака.Если вы определяете собственное сообщение, вы можете назначить его параметры соответствующим образом.

9 голосов
/ 01 февраля 2017
                 | 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;

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

5 голосов
/ 14 июня 2011

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

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

2 голосов
/ 14 июня 2011

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

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

1 голос
/ 14 июня 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...