用鼠标滚轮实现DGBrid滚动条的滚动,该怎么解决

用鼠标滚轮实现DGBrid滚动条的滚动
Procedure   TForm2.OnMouseWheel(Var   Msg:   TMsg;var   Handled:   Boolean);
begin
  if   Msg.message=WM_MouseWheel   then
  begin
    if   Msg.wParam> 0   then
    begin
      if   DBGrid1.Focused   then
      SendMessage(DBGrid1.Handle,WM_VSCROLL,SB_PAGEUP,0);
    end
    else
    begin
      if   DBGrid1.Focused   then
      SendMessage(DBGrid1.Handle,WM_VSCROLL,SB_PAGEDOWN,0);
    end;
    Handled:=True;
  end;
end;

procedure   TForm2.FormCreate(Sender:   TObject);
begin
  Application.OnMessage:=OnMouseWheel;
end;
用上面的代码可以用鼠标滑轮实现在单窗口中DBGrid滚动条的滚动,但如果有多个子窗体存在且每个子窗体内都有DBGrid时就会出错,请问这个时候该怎么改才能实现每个子窗体中的DBGrid滚动条都可随着鼠标滑轮的滚动而滚动呢?

------解决方案--------------------
private
{ Private declarations }
OldGridWnd: TWndMethod;
procedure NewGridWnd(var Message: TMessage);

............

procedure TForm.FormCreate(Sender: TObject);
begin
OldGridWnd := DBGrid1.WindowProc;
DBGrid1.WindowProc := NewGridWnd;
end;


procedure TForm4.NewGridWnd(var Message: TMessage);
var
IsNeg: Boolean;
begin
if Message.Msg = WM_MOUSEWHEEL then
begin
IsNeg := Short(Message.WParamHi) < 0;
if IsNeg then
DBGrid1.DataSource.DataSet.MoveBy(1)
else
DBGrid1.DataSource.DataSet.MoveBy(-1);
end
else
OldGridWnd(Message);
end;