9
votes

I am trying to detect the movement of the mouse wheel (while the CTRL key is pressed) using a TApplicationEvents.OnMessage event in Delphi 7. This is the code I am using:

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;

According to the MSDN resource (http://msdn.microsoft.com/en-us/library/windows/desktop/ms645617(v=vs.85).aspx ) a negative value for the HiWord of (Msg.wParam) indicates that the wheel has been moved backward, toward the user.

Problem is, I never receive a negative value when the wheel is moved backward. When I scroll backward, I get a value of 120. When I scroll forward, I get 65416.

What am I doing wrong?

1

1 Answers

12
votes

HiWord returns a Word which is an unsigned 16 bit integer. The documentation you linked states,

Use the following code to get the information in the wParam parameter:

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

where GET_WHEEL_DELTA_WPARAM is defined in 'winuser.h' as follows:

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

As you can see the high-word is type-casted to a short. A SHORT as a windows data type is a 16 bit signed integer which corresponds to a Smallint in Delphi. So you can cast it like so:

if Smallint(HiWord(Msg.wParam)) < 0 then begin