Изменяется ли расположение «младшего слова» и «верхнего слова» параметра wParam в 64-битном коде?

#delphi #32bit-64bit

#delphi #32-битный-64-битный

Вопрос:

Я пытаюсь обработать сообщение WM_XBUTTONUP, которое исходит от дополнительных кнопок мыши на некоторых мышах. В документации SDK указано, что младшее слово wParam содержит информацию о виртуальном ключе, а старшее слово содержит, какая кнопка была нажата. Я понимаю, как это работает в 32-битном коде, однако в 64-битном коде wParam представляет собой 64-битное целое число без знака. Я видел код, который использует Lo (msg.wparam) и Hi (msg.wparam). Этот код все еще работает в 64-битном коде или что-то должно измениться? Другими словами, меняется ли определение «старшего слова» с 32-битного на 64-битное?

Комментарии:

1. Я просто хотел упомянуть, что, к сожалению, у меня нет мыши с дополнительными кнопками для тестирования, иначе я бы отладил msg, чтобы разобраться в этом.

Ответ №1:

Вы должны были показать код. Lo и Hi возвращают младший байт и старший байт 16-битного значения соответственно, чтобы они также не работали с 32-битным кодом. Возможно, вы имели в виду LoWord и HiWord .

В 64-битном коде вы можете ввести 64-битное целое значение в Int64Rec :

case Int64Rec(Msg.WParam).Lo of

Комментарии:

1. Int64Rec(Msg.WParam) может компилироваться только для 64-разрядных целей. Вам понадобится условный код для компиляции для 32-битных целей.

Ответ №2:

Любой код, который использует Lo() и Hi() является неправильным, потому что эти функции возвращают байты младшего и старшего порядка a Word .


В документации MSDN говорится следующее:

Используйте следующий код, чтобы получить информацию в параметре wParam:

 fwKeys = GET_KEYSTATE_WPARAM (wParam); 
fwButton = GET_XBUTTON_WPARAM (wParam);
  

Эти макросы определены в заголовочных файлах как:

 #define GET_KEYSTATE_WPARAM(wParam)     (LOWORD(wParam))
#define GET_XBUTTON_WPARAM(wParam)      (HIWORD(wParam))
  

В свою очередь, LOWORD и HIWORD определяются следующим образом:

 #define LOWORD(_dw)     ((WORD)(((DWORD_PTR)(_dw)) amp; 0xffff))
#define HIWORD(_dw)     ((WORD)((((DWORD_PTR)(_dw)) >> 16) amp; 0xffff))
  

Эти макросы предназначены для выполнения правильной задачи при компиляции как в 32-битный, так и в 64-битный код.

В Delphi Windows модуль содержит переводы LoWord и HiWord , которые выполняют те же задачи, хотя и реализованы несколько по-другому. Итак, я бы реализовал следующие функции:

 function GET_KEYSTATE_WPARAM(wParam: WPARAM): Word; inline;
function GET_XBUTTON_WPARAM(wParam: WPARAM): Word; inline;

....

function GET_KEYSTATE_WPARAM(wParam: WPARAM): Word;
begin
  Result := LoWord(wParam);
end;

function GET_XBUTTON_WPARAM(wParam: WPARAM): Word;
begin
  Result := HiWord(wParam);
end;
  

Комментарии:

1. Спасибо за ответ. Не кажется ли странным, что «старшее слово» 64-битного значения обрабатывается так же, как и 32-битное значение? Кажется, что это должно быть>> 32 вместо>> 16? Или я просто неправильно об этом думаю?

2. К вашему сведению, если вы используете обработчик TMessage на основе для получения сообщения, TMessage у него уже есть свои собственные WParamLo/Hi LParamLo/Hi элементы и для разделения значений для вас, и они отлично работают в 64-битном коде.

3. >> 48 даст вам старшее слово 64-битного целого числа. Что здесь действительно происходит HiWord , так это то, что он получает второе слово из четырех.

4. Спасибо за разъяснение, Дэвид. Я думаю, это просто, что я подумал, что «высокое слово» немного неоднозначно в 64-битном случае.

5. @MarkF Действительно так. Это старшее слово младшего dword, если это имеет смысл! Помните, что все это началось в 32-битные дни.