Delphi 如何在非活动窗体上显示提示

Delphi 如何在非活动窗体上显示提示,delphi,Delphi,我想在鼠标移动时显示提示,就像在Winamp中一样。无需关注应用程序。谢谢您的帮助。您可以弹出提示,但如果应用程序不是聚焦应用程序,我不确定您是否可以这样做 这将显示设置了提示且ShowHint=True的任何内容的提示。但前提是它是focusseed应用程序。(正如Sertac Akyuz在对原始帖子的评论中所说,VCL只对当前活动的表单执行此操作) 希望这有帮助。您可以弹出提示,但如果应用程序不是聚焦应用程序,我不确定您是否可以这样做 这将显示设置了提示且ShowHint=True的任何内容

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

您可以弹出提示,但如果应用程序不是聚焦应用程序,我不确定您是否可以这样做

这将显示设置了提示且ShowHint=True的任何内容的提示。但前提是它是focusseed应用程序。(正如Sertac Akyuz在对原始帖子的评论中所说,VCL只对当前活动的表单执行此操作)


希望这有帮助。

您可以弹出提示,但如果应用程序不是聚焦应用程序,我不确定您是否可以这样做

这将显示设置了提示且ShowHint=True的任何内容的提示。但前提是它是focusseed应用程序。(正如Sertac Akyuz在对原始帖子的评论中所说,VCL只对当前活动的表单执行此操作)


希望这能有所帮助。

有一种方法可以检测鼠标光标位置是否在某个控件上,方法是定期检查鼠标光标相对于该控件的位置。您可以使用计时器和下一个代码执行此操作:

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';
通过遍历表单组件列表,或者更好地为此创建自己的特定列表,可能会有更好的解决方案。
现在唯一的问题是提示只针对活动应用程序显示。因此,如果您想在应用程序未激活的情况下显示提示,您必须创建自己的提示系统(创建一个显示提示文本的小表单)。

有一种方法可以通过定期检查鼠标光标相对于控件的位置来检测鼠标光标位置是否在某个控件上。您可以使用计时器和下一个代码执行此操作:

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';
通过遍历表单组件列表,或者更好地为此创建自己的特定列表,可能会有更好的解决方案。
现在唯一的问题是提示只针对活动应用程序显示。因此,如果您想在应用程序未激活的情况下显示提示,您必须创建自己的提示系统(创建一个显示提示文本的小表单)。

最后,它现在可以工作了。我已将VCL.Forms.pas复制到项目目录

就像Sertac Akyuz说的那样,在那里进行了一次地面任务检查

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

现在终于可以工作了。我已将VCL.Forms.pas复制到项目目录

就像Sertac Akyuz说的那样,在那里进行了一次地面任务检查

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

没有内置的机制。VCL检查活动窗口是否来自当前进程或线程(取决于某些EnumAllWindowsOnActivateHint)。感谢您的回答。Jus认为也许有一个简单的方法,但我找不到信息。我会通过的。内置机制不行。VCL检查活动窗口是否来自当前进程或线程(取决于某些EnumAllWindowsOnActivateHint)。感谢您的回答。Jus认为也许有一个简单的方法,但我找不到信息。我会通过的。谢谢。想知道winamp是怎么做到的。现在我知道为什么winamp有时会在Windows上使旧的DirectDRaw游戏崩溃7@user-为什么winamp不这么做?没什么奇怪的。正如我在对问题的评论中所说,是VCL没有以这种方式设计提示系统。如果愿意,您可以修改它。只需在
TApplication.ActivateHint
@Sertac Akyuz hi中删除
ForegroundTaskCheck
,我再次将vcl.forms.pas复制到新项目目录,并删除ForegroundTaskCheck,效果良好。但对于较旧的项目,我在使用vcl.forms.pas时有很多AV,甚至没有编辑。有没有建议为什么我不能使用源文件中的vcl.forms?我使用Delphi Xe7谢谢。想知道winamp是怎么做到的。现在我知道为什么winamp有时会在Windows上使旧的DirectDRaw游戏崩溃7@user-为什么winamp不这么做?没什么奇怪的。正如我在对问题的评论中所说,是VCL没有以这种方式设计提示系统。如果愿意,您可以修改它。只需在
TApplication.ActivateHint
@Sertac Akyuz hi中删除
ForegroundTaskCheck
,我再次将vcl.forms.pas复制到新项目目录,并删除ForegroundTaskCheck,效果良好。但对于较旧的项目,我在使用vcl.forms.pas时有很多AV,甚至没有编辑。有没有建议为什么我不能使用源文件中的vcl.forms?我正在使用delphixe7