【问题标题】:How to highlight mouse pointer position using Delphi如何使用 Delphi 突出显示鼠标指针位置
【发布时间】:2022-06-10 20:00:28
【问题描述】:

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

任何想法都值得赞赏。

例子:

【问题讨论】:

  • 其实这是一个纯Win32问题,与Delphi特别无关;例如,在 C++ 中答案是一样的。
  • 无论如何:一个非常简单的方法是创建一个半透明窗口并让它跟踪光标。
  • 创建一个TForm,带有背景色和黄色圆圈。根据需要设置表单的TransparentColorAlphaBlend 属性。然后使用计时器或 Win32 挂钩将 TForm 在屏幕上移动到鼠标光标当前所在的位置。

标签: delphi delphi-10.3-rio


【解决方案1】:

虽然我认为这个问题对于 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

覆盖表单的CreateParams 方法:

procedure TMouseDiskForm.CreateParams(var Params: TCreateParams);
begin
  inherited;
  Params.ExStyle := Params.ExStyle or WS_EX_LAYERED or WS_EX_TRANSPARENT;
end;

然后在您的主窗体中,只需添加一个 TTimerInterval = 50 和这个 OnTimer 处理程序:

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;

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

【讨论】:

    猜你喜欢
    • 2020-02-04
    • 1970-01-01
    • 2010-12-24
    • 2010-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-19
    • 2012-06-30
    相关资源
    最近更新 更多