鼠标光标下的识别组件不适用于 TImage 控件

Identify Component under mouse cursor does not work with TImage Control

我正在使用以下过程来识别 Delphi XE3 中鼠标下的控件。 vcl.contols 一切正常。但是,当鼠标悬停在 TImage 上时,不会返回控件名称。

procedure TMainForm.ApplicationEvents1Idle(Sender: TObject; var Done: oolean);    
var
  ctrl : TWinControl;
begin    
  ctrl := FindVCLWindow(Mouse.CursorPos);     
  if ctrl <> nil then begin    
    Label2.caption := ctrl.Name;    
    //do something if mouse is over TLabeledEdit    
    if ctrl is TLabeledEdit the begin    
      Caption := TLabeledEdit(ctrl).Text;    
    end;
  end;
end;

是否有一种简单的方法来访问 TImage 的名称 - 我是否遗漏了一些非常简单的东西?

FindVCLWindow 查找 TWinControl 的后代。由于 TImage 不是 windowed 控件并且它不继承自 TWinControl,因此 FindVCLWindow 将无法找到它。就像它将无法在其祖先中找到任何其他不具有 TWinControl class 的控件一样。

但是,有一个类似的函数 FindDragTarget 可以 return 任何 VCL 控件,包括非 window 控件。

这个函数也在Vcl.Controls中声明,就像FindVCLWindow

function FindDragTarget(const Pos: TPoint; AllowDisabled: Boolean): TControl;

它有额外的参数 - AllowDisabled 控制是否 return 禁用控件。

您应该按如下方式重写您的方法 - 请注意 ctrl 必须重新声明为 TControl

procedure TMainForm.ApplicationEvents1Idle(Sender: TObject; var Done: Boolean);
var
  ctrl : TControl;
begin
  ctrl := FindDragTarget(Mouse.CursorPos, true);
  if ctrl <> nil then
    begin
      Label2.caption := ctrl.Name;
      ...
    end;
end;