WParam的“低字”和“高字”位置是否在64位代码中发生变化?

时间:2014-06-16 14:45:21

标签: delphi 32bit-64bit

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

2 个答案:

答案 0 :(得分:4)

您应该已经显示了代码。 LoHi分别返回16位值的低字节和高字节,因此它们也不能使用32位代码。也许你的意思是LoWordHiWord

在64位代码中,您可以将64位整数值强制转换为Int64Rec

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

答案 1 :(得分:3)

使用Lo()Hi()的任何代码都是错误的,因为这些函数会返回Word的低位和高位字节。


MSDN documentation说明如下:

  

使用以下代码获取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))

反过来,LOWORDHIWORD的定义如下:

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

这些宏用于在编译为32位和64位代码时执行正确的任务。

在Delphi中,Windows单元包含执行相同任务的LoWordHiWord的翻译,尽管以稍微不同的方式实现。所以我将实现以下功能:

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;