如何使用Delphi突出显示鼠标指针位置

And*_*zej 1 delphi delphi-10.3-rio

我想创建一个简单的鼠标指针荧光笔。以鼠标指针为中心的圆圈。它必须是半透明的并且在任何地方都可见(在我的应用程序内外)。

任何想法表示赞赏。

例子:

在此输入图像描述

And*_*and 6

虽然我认为这个问题对于 Stack Overflow 来说有点太宽泛了,但我还是忍不住写下这个简短的答案,因为除了 VCL 之外几乎什么都不用做这个问题的原始实现,这不仅容易,而且出乎意料地容易。

这个想法是有一个跟随鼠标光标的半透明、无边框窗体(窗口)。普通表单TTimer每秒会多次更新表单的位置。

创建一个新的 VCL 应用程序。除了主表单之外,还创建另一个表单 ,MouseDiscForm具有以下属性:

object MouseDiscForm: TMouseDiscForm
  AlphaBlend = True
  AlphaBlendValue = 127
  BorderStyle = bsNone
  ClientHeight = 64
  ClientWidth = 64
  Color = clWhite
  TransparentColor = True
  TransparentColorValue = clWhite
  FormStyle = fsStayOnTop
  object Shape1: TShape
    Align = alClient
    Brush.Color = clYellow
    Pen.Style = psClear
    Shape = stCircle
  end
end
Run Code Online (Sandbox Code Playgroud)

重写表单的CreateParams方法:

procedure TMouseDiskForm.CreateParams(var Params: TCreateParams);
begin
  inherited;
  Params.ExStyle := Params.ExStyle or WS_EX_LAYERED or WS_EX_TRANSPARENT;
end;
Run Code Online (Sandbox Code Playgroud)

然后在主窗体中,只需添加一个TTimerwithInterval = 50和 thisOnTimer处理程序:

procedure TForm6.Timer1Timer(Sender: TObject);
begin
  var CP := Mouse.CursorPos;
  SetWindowPos(
    MouseDiscForm.Handle,
    HWND_TOPMOST,
    CP.X - MouseDiscForm.Width div 2,
    CP.Y - MouseDiscForm.Height div 2,
    0,
    0,
    SWP_SHOWWINDOW or SWP_NOSIZE or SWP_NOACTIVATE
  );
end;
Run Code Online (Sandbox Code Playgroud)

我确信还有一些额外的细节需要考虑,但总的来说,我确实发现这种非常原始的方法效果很好。

屏幕录制

  • 仅供参考,“WS_EX_LAYERED”窗口样式由表单的“TransparentColor...”和“AlphaBlend...”属性处理,因此您无需在“CreateParams()”中手动启用它。另外,为什么要将“TTimer”放在 MainForm 上而不是放在“TMouseDiskForm”本身上? (2认同)