【问题标题】:Does the "low word" and "high word" locations of a WParam change in 64bit code?WParam 的“低字”和“高字”位置在 64 位代码中是否发生变化?
【发布时间】:2014-08-06 10:23:45
【问题描述】:

我正在尝试处理来自某些鼠标上的额外鼠标按钮的 WM_XBUTTONUP 消息。 SDK 文档说明 wParam 的低位字保存虚拟键信息,高位字保存按下的按钮。我了解这在 32 位代码中是如何工作的,但是在 64 位代码中 wParam 是一个 64 位无符号整数。我见过使用 Lo(msg.wparam) 和 Hi(msg.wparam) 的代码。此代码是否仍可在 64 位中工作,还是必须更改某些内容?也就是说,“高位字”的定义是不是从32bit变成了64bit?

【问题讨论】:

  • 我只是想提一下,不幸的是我没有带有额外按钮的鼠标来测试,否则我会调试 msg 来解决这个问题。

标签: delphi 32bit-64bit


【解决方案1】:

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

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

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

【讨论】:

  • Int64Rec(Msg.WParam) 只能编译 64 位目标。您需要条件代码来编译 32 位目标。
【解决方案2】:

任何使用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;

【讨论】:

  • 感谢您的回答。 64 位值的“高位字”与 32 位值的处理方式相同,这看起来很奇怪吗?似乎应该是>> 32而不是>> 16?还是我只是想错了?
  • 仅供参考,如果您使用基于 TMessage 的处理程序来接收消息,TMessage 已经有自己的 WParamLo/HiLParamLo/Hi 成员来为您分隔值,并且它们可以工作64位的就好了。
  • >> 48 会给你一个 64 位整数的高位字。 HiWord 真正发生的事情是它正在获得四个字中的第二个字。
  • 感谢您的澄清,大卫。我想只是我在想“高位词”在 64 位的情况下有点模棱两可。
  • @MarkF 确实如此。这是低双字的高字,如果有道理的话!请记住,这一切都始于 32 位天。
猜你喜欢
  • 1970-01-01
  • 2011-12-29
  • 2021-10-15
  • 1970-01-01
  • 2018-10-29
  • 1970-01-01
  • 1970-01-01
  • 2014-07-31
  • 1970-01-01
相关资源
最近更新 更多