我想在鼠标移动时显示提示,就像在Winamp中一样。无需关注应用程序。谢谢你的帮助。
答案 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-}