WParam 的"low word"和"high word"位置是否会在 64 位代码中更改?



我试图处理WM_XBUTTONUP消息,这是来自一些鼠标上的额外鼠标按钮。SDK文档指出,wParam的低字保存虚拟键信息,高字保存被按下的按钮。我理解这在32位代码中是如何工作的,但是在64位代码中,wParam是一个64位无符号整数。我见过使用Lo(msg.wparam)和Hi(msg.wparam)的代码。这个代码是否仍然在64位工作,或者有什么必须改变?换句话说,"高字"的定义是否从32位变为64位?

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

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

case Int64Rec(Msg.WParam).Lo of

任何使用Lo()Hi()的代码都是错误的,因为这些函数返回的是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))

依次定义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;

相关内容

最新更新