我正在尝试使用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),(Msg.wParam)的HiWord的负值表示车轮已向后移动,朝向用户。
问题是,当车轮向后移动时,我从未收到负值。当我向后滚动时,我得到120的值。当我向前滚动时,我得到65416。
我做错了什么?
答案 0 :(得分: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))
正如您所看到的那样,高字会被输入 short 。 SHORT
作为windows data type是16位有符号整数,对应于Delphi中的Smallint
。所以你可以像这样投射它:
if Smallint(HiWord(Msg.wParam)) < 0 then begin