Delphi 是不是;“低字”;及;“高字”;64位代码中WParam更改的位置?

Delphi 是不是;“低字”;及;“高字”;64位代码中WParam更改的位置?,delphi,32bit-64bit,Delphi,32bit 64bit,我正在尝试处理WMxButtonP消息,该消息来自一些鼠标上的额外鼠标按钮。SDK文档说明wParam的低位字保存虚拟键信息,高位字保存按下的按钮。我知道这在32位代码中是如何工作的,但是在64位代码中,wParam是一个64位无符号整数。我见过使用Lo(msg.wparam)和Hi(msg.wparam)的代码。这段代码是否仍然以64位的格式工作,或者是否需要更改某些内容?换句话说,“高级字”的定义是否从32位更改为64位?您应该显示代码Lo和Hi分别返回16位值的低字节和高字节,因此它们也不

我正在尝试处理WMxButtonP消息,该消息来自一些鼠标上的额外鼠标按钮。SDK文档说明wParam的低位字保存虚拟键信息,高位字保存按下的按钮。我知道这在32位代码中是如何工作的,但是在64位代码中,wParam是一个64位无符号整数。我见过使用Lo(msg.wparam)和Hi(msg.wparam)的代码。这段代码是否仍然以64位的格式工作,或者是否需要更改某些内容?换句话说,“高级字”的定义是否从32位更改为64位?

您应该显示代码
Lo
Hi
分别返回16位值的低字节和高字节,因此它们也不能处理32位代码。也许你的意思是
LoWord
HiWord

在64位代码中,您可以将64位整数值类型转换为:

case Int64Rec(Msg.WParam).Lo of
..

任何使用错误的代码,因为这些函数返回
字的低位字节和高位字节


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)) & 0xffff))
#define HIWORD(_dw)     ((WORD)((((DWORD_PTR)(_dw)) >> 16) & 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;

我只是想说,不幸的是,我没有一个带有额外按钮的鼠标来测试,否则我会调试msg来解决这个问题。
Int64Rec(msg.WParam)
只能为64位目标编译。您需要条件代码来编译32位目标。谢谢您的回答。64位值的“高位字”处理方式与32位值相同,这似乎奇怪吗?看起来应该是>>32而不是>>16?或者我只是想得不对?仅供参考,如果您使用基于
TMessage
的处理程序来接收消息,
TMessage
已经有了自己的
WParamLo/Hi
LParamLo/Hi
成员来为您分隔值,它们在64位中工作得很好。
>48
将给出64位整数的高位字。这里真正发生的事情是,
HiWord
得到了四个单词中的第二个。谢谢你的澄清,大卫。我想这只是因为我认为“high word”在64位的情况下有点模棱两可。@MarkF确实是这样。如果这有意义的话,这是低双字中的高字!记住,所有这些都是从32位开始的。