#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-битные дни.