当鼠标不在时,如何防止聚焦控制滚动?

时间:2015-12-08 00:29:59

标签: delphi scroll mousewheel

请参阅this prior related question。虽然那里的答案确实有效,但在涉及某些类型的控件时,我还有其他问题,例如TDBGrid。如果TDBGrid当前具有焦点,但鼠标指向另一个控件以进行滚动,则TDBGrid无论如何都会滚动,从而导致两个不同的控件同时滚动。这种情况发生在我迄今为止发现的每个解决方案中,与滚动鼠标下方的控件有关。

如何防止此行为并确保鼠标滚动下的控件,而不是其他内容?

1 个答案:

答案 0 :(得分:0)

此代码适用于我。

procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG; var Handled: Boolean);
var
  Control: TWinControl;
begin

  if Msg.message = WM_MOUSEWHEEL then
  begin
    // Find control at mouse cursor
    Control := FindVCLWindow(Msg.pt);

    if Assigned(Control) then
    begin
      // Try to scroll
      if Control.Perform(CM_MOUSEWHEEL, Msg.wParam, Msg.lParam) <> 0 then
        Handled := True
      else
      // If no scroll was performed by control,
      // then detrmine if message control is at mouse cursor.
      // If not, then supress message
      if Control.Handle <> Msg.hwnd then
        Handled := True;
    end;
  end;

end;