MOUSE_WHEEL delta总是积极的

use*_*613 9 delphi

我正在尝试使用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;
Run Code Online (Sandbox Code Playgroud)

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

问题是,当车轮向后移动时,我从未收到负值.当我向后滚动时,我得到120的值.当我向前滚动时,我得到65416.

我究竟做错了什么?

Ser*_*yuz 12

HiWord返回一个Word无符号的16位整数.您链接的文档说明,

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

  fwKeys = GET_KEYSTATE_WPARAM(wParam); 
  zDelta = GET_WHEEL_DELTA_WPARAM(wParam);
Run Code Online (Sandbox Code Playgroud)

其中GET_WHEEL_DELTA_WPARAM在"WINUSER.H"定义如下:

#define GET_WHEEL_DELTA_WPARAM(wParam)  ((short)HIWORD(wParam))
Run Code Online (Sandbox Code Playgroud)

正如你所看到的那样,高字是类型化为.SHORT作为Windows数据类型的 A 是16位有符号整数,对应Smallint于Delphi中的a.所以你可以像这样投射它:

if Smallint(HiWord(Msg.wParam)) < 0 then begin
Run Code Online (Sandbox Code Playgroud)