如何让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;
这段代码会针对当前登录用户自动配置注册表项,完全不需要用户手动操作。
最后验证要点
- 确保Windows设置里的通知和操作中,你的应用的“在操作中心显示通知”开关是开启的(代码设置注册表后一般会自动同步);
- 测试时如果用调试模式,确保通知发送逻辑没有被断点打断;
- 若仍有问题,检查Windows设置>隐私>通知里,应用是否被允许发送通知。
内容的提问来源于stack exchange,提问作者SHIN JaeGuk
相关产品推荐
相关产品推荐

