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

如何让Delphi 10.2发送的Windows 10通知留存于操作中心?

解决Delphi 10.2 Windows 10通知无法留存操作中心的问题

我之前也碰到过一模一样的情况——用Embarcadero的默认Toast示例发通知,刚弹出来就消失得无影无踪,操作中心里根本找不到痕迹。结合你提到的系统开关已开启、对应注册表项值也为1的情况,问题大概率出在通知的持久化配置或者Delphi组件的默认设置上,下面给你几个可行的解决方案,包括多用户场景的处理:

一、修改TNotification核心属性(最简单直接的方法)

Delphi的TNotificationCenter组件默认创建的是临时通知(nkTransient),这种通知会自动消失且不会留存到操作中心。你只需要在创建通知时修改两个关键属性:

var
  Notification: TNotification;
begin
  Notification := NotificationCenter1.CreateNotification;
  try
    // 设置通知标题和内容
    Notification.Title := '我的持久化通知';
    Notification.AlertBody := '这条通知会一直留在操作中心,直到你手动清除';
    
    // 关键1:将通知类型设为持久化
    Notification.Kind := nkPersistent;
    
    // 关键2:设置过期时间(比如1天后自动过期,避免通知长期堆积)
    Notification.ExpirationDate := Now + 1;
    
    // 发送通知
    NotificationCenter1.PresentNotification(Notification);
  finally
    Notification.Free;
  end;
end;

这里的nkPersistent是核心,它会告诉Windows把这条通知保留在操作中心,直到用户手动清除或者到达设置的过期时间。

二、自定义Windows Toast XML模板(更灵活的控制)

如果上面的方法不生效,可能是Embarcadero默认的Toast模板没有配置持久化参数。你可以直接定义符合Windows 10规范的Toast XML,手动控制通知的行为:

var
  ToastXML: string;
  Notification: TNotification;
begin
  // 定义包含持久化设置的Toast XML
  ToastXML := '<toast duration="long">' +
                '<visual>' +
                  '<binding template="ToastGeneric">' +
                    '<text>自定义持久化通知</text>' +
                    '<text>这条通知会在操作中心留存,直到你主动删除</text>' +
                  '</binding>' +
                '</visual>' +
              '</toast>';
  
  Notification := NotificationCenter1.CreateNotification;
  try
    // 应用自定义XML模板
    Notification.CustomToastXML := ToastXML;
    // 同样设置为持久化类型
    Notification.Kind := nkPersistent;
    NotificationCenter1.PresentNotification(Notification);
  finally
    Notification.Free;
  end;
end;

这里的duration="long"会让通知在屏幕上停留更久,配合nkPersistent就能确保它被保存到操作中心。

三、自动配置多用户的注册表项(无需手动修改)

你提到每个用户都要手动处理注册表的问题,其实可以在应用启动时,通过代码自动检查并设置对应注册表项,这样用户第一次运行应用时就自动完成配置:

uses
  Winapi.Windows, System.Win.Registry;

procedure EnsureActionCenterSetting;
var
  Reg: TRegistry;
begin
  Reg := TRegistry.Create(KEY_WRITE or KEY_READ);
  try
    Reg.RootKey := HKEY_CURRENT_USER;
    // 打开或创建目标注册表路径
    if Reg.OpenKey('Software\Microsoft\Windows\CurrentVersion\Notifications\Settings\Embarcadero.DesktopToasts.0579D43A', True) then
    begin
      // 检查并设置ShowInActionCenter值为1
      if Reg.ReadInteger('ShowInActionCenter') <> 1 then
        Reg.WriteInteger('ShowInActionCenter', 1);
      Reg.CloseKey;
    end;
  finally
    Reg.Free;
  end;
end;

// 在应用启动时调用(比如主窗体的FormCreate事件中)
procedure TForm1.FormCreate(Sender: TObject);
begin
  EnsureActionCenterSetting;
end;

这段代码会针对当前登录用户自动配置注册表项,完全不需要用户手动操作。

最后验证要点

  1. 确保Windows设置里的通知和操作中,你的应用的“在操作中心显示通知”开关是开启的(代码设置注册表后一般会自动同步);
  2. 测试时如果用调试模式,确保通知发送逻辑没有被断点打断;
  3. 若仍有问题,检查Windows设置>隐私>通知里,应用是否被允许发送通知。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 07:17:53