9

我正在尝试使用 Delphi 7 中的 TApplicationEvents.OnMessage 事件检测鼠标滚轮的移动(按下 CTRL 键)。这是我正在使用的代码:

if Msg.message = WM_MOUSEWHEEL then begin
 if Word(Msg.wParam) = MK_CONTROL then begin
  Edit1.Text := IntToStr(HiWord(Msg.wParam));
   if HiWord(Msg.wParam) < 0 then begin
    IncZoom;
   end else begin
    DecZoom;
   end;
 end;
end;

根据 MSDN 资源 ( http://msdn.microsoft.com/en-us/library/windows/desktop/ms645617(v=vs.85).aspx),HiWord的 (Msg.wParam) 为负值表示轮子已经向后移动,朝向用户。

问题是,当车轮向后移动时,我永远不会收到负值。当我向后滚动时,我得到一个值 120。当我向前滚动时,我得到 65416。

我究竟做错了什么?

4

1 回答 1

12

HiWord返回一个Word无符号的 16 位整数。您链接的文档指出,

使用以下代码获取 wParam 参数中的信息:

  fwKeys = GET_KEYSTATE_WPARAM(wParam); 
  zDelta = GET_WHEEL_DELTA_WPARAM(wParam);

其中GET_WHEEL_DELTA_WPARAM在“winuser.h”中定义如下:

#define GET_WHEEL_DELTA_WPARAM(wParam)  ((short)HIWORD(wParam))

如您所见,高字被强制转换为shortSHORT作为windows 数据类型的A是一个 16 位有符号整数,对应Smallint于 Delphi 中的 a。所以你可以像这样投射它:

if Smallint(HiWord(Msg.wParam)) < 0 then begin
于 2013-09-15T10:12:10.313 回答