You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从废弃的TCoolTrayIcon转Delphi TTrayIcon,如何添加OnMouseEnter/OnMouseLeave事件?

为Delphi自带TTrayIcon添加OnMouseEnter/OnMouseExit事件的简便方案

其实不用依赖计时器,利用Windows原生的TrackMouseEvent函数结合消息拦截就能实现,比轮询式的计时器高效得多,下面是具体的实现步骤:

一、在窗体中快速实现(适合临时验证)

  1. 添加私有变量和消息处理函数
    在窗体的private声明区添加以下内容:

    private
      FMouseOverTray: Boolean;
      procedure WMTrayMouseLeave(var Msg: TMessage); message WM_MOUSELEAVE;
    

    FMouseOverTray用来标记鼠标是否处于托盘图标区域,WMTrayMouseLeave是专门处理鼠标离开消息的函数。

  2. 处理TTrayIcon的OnMouseMove事件
    给TTrayIcon组件的OnMouseMove事件绑定如下代码:

    procedure TYourForm.TrayIcon1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
    var
      TrackMsg: TTrackMouseEvent;
    begin
      if not FMouseOverTray then
      begin
        FMouseOverTray := True;
        // 这里编写你的OnMouseEnter逻辑,比如显示自定义提示框
        ShowMessage('鼠标进入托盘图标');
        
        // 通知系统开始追踪鼠标离开事件
        FillChar(TrackMsg, SizeOf(TrackMsg), 0);
        TrackMsg.cbSize := SizeOf(TrackMsg);
        TrackMsg.dwFlags := TME_LEAVE;
        TrackMsg.hwndTrack := TrayIcon1.Handle;
        TrackMouseEvent(TrackMsg);
      end;
    end;
    
  3. 实现鼠标离开的消息处理
    编写WMTrayMouseLeave函数的具体内容:

    procedure TYourForm.WMTrayMouseLeave(var Msg: TMessage);
    begin
      if FMouseOverTray then
      begin
        FMouseOverTray := False;
        // 这里编写你的OnMouseExit逻辑,比如隐藏提示框
        ShowMessage('鼠标离开托盘图标');
      end;
    end;
    

二、封装成可复用组件(进阶方案)

如果需要在多个项目中重复使用,可以自定义一个继承自TTrayIcon的组件:

  1. 创建新的组件单元,继承TTrayIcon类
  2. 在类中添加OnMouseEnter和OnMouseExit的事件声明
  3. 内部用上述TrackMouseEvent的逻辑处理消息,触发自定义事件
    后续直接拖这个组件到窗体就能用,无需重复编写代码。

为什么这个方案优于计时器?

计时器是定时轮询鼠标位置,会占用不必要的CPU资源;而TrackMouseEvent是系统级的消息通知,只有当鼠标真正进入/离开托盘图标时才会触发事件,既高效又精准。

内容的提问来源于stack exchange,提问作者CodeX

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:37:30