如何在非活动表单上显示提示

时间:2014-05-31 13:55:04

标签: delphi

我想在鼠标移动时显示提示,就像在Winamp中一样。无需关注应用程序。谢谢你的帮助。

3 个答案:

答案 0 :(得分:2)

您可以设置提示弹出窗口,但如果应用程序不是专注的应用程序,我不确定您是否可以这样做。

这将显示提示设置和ShowHint = True的任何提示。但只有它是焦点应用程序。 (正如Sertac Akyuz在对原始帖子的评论中所说,VCL仅针对当前活动的形式进行了此操作)。

procedure TForm1.ControlMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
var
  aPoint: TPoint;
  aControl: TControl;
begin

  aControl := TControl(Sender);
  if aControl.ShowHint = true then
  begin
    aPoint.X := X;
    aPoint.Y := Y;

    if Assigned(aControl.Parent) then
      aPoint := aControl.ClientToParent(aPoint);
    aPoint := ClientToScreen(aPoint);

    Application.ActivateHint(aPoint);
  end;
end;

希望这有帮助。

答案 1 :(得分:1)

通过定期检查与控制客户端矩形相关的鼠标光标位置,有一种方法可以检测鼠标光标位置是否超过某个控件。您可以使用Timer和下一个代码执行此操作:

procedure TForm4.Timer1Timer(Sender: TObject);
if Panel1.ClientRect.Contains(Panel1.ScreenToClient(Mouse.CursorPos)) then
begin
    Form4.Caption := 'Panel1';
end
else if Panel2.ClientRect.Contains(Panel2.ScreenToClient(Mouse.CursorPos)) then
begin
    Form4.Caption := 'Panel2';
end
else if Panel3.ClientRect.Contains(Panel3.ScreenToClient(Mouse.CursorPos)) then
begin
    Form4.Caption := 'Panel3';
end
else if Panel4.ClientRect.Contains(Panel4.ScreenToClient(Mouse.CursorPos)) then
begin
    Form4.Caption := 'Panel4';
end
else Form4.Caption := 'None';

通过迭代表单组件列表或者甚至更好地为此创建自己的特定列表,可能有一些更好的解决方案。 现在唯一的问题是提示仅针对活动应用程序显示。因此,如果您希望显示提示,即使您的应用程序未处于活动状态,您也必须创建自己的提示系统(创建一个显示提示文本的小表单)。

答案 2 :(得分:1)

最后它现在有效。我将VCL.Forms.pas复制到项目目录

删除ForegroundTaskCheck就像Sertac Akyuz所说

var
  HintInfoMsg: TCMHintInfo;
{$ENDIF}
begin
  FHintActive := False;
  HintInfo.ReshowTimeout := 0;
  if FShowHint and (FHintControl <> nil) {and ForegroundTaskCheck(EnumAllWindowsOnActivateHint)} and

最重要的是在VCL.Forms.pas中添加{$ B-}(没有很多AV和崩溃)

unit Vcl.Forms;
{$B-}