如何用Windows.UI.Notifications API缩短Toast通知屏显时长至7秒内
Windows Toast通知缩短屏幕显示时长实现方案
核心原因
Windows系统原生Toast的屏幕驻留时长默认受系统全局设置约束,用户可在「辅助功能>视觉效果」中调整的最短档位为5秒,没有开放自定义任意时长的原生配置。expiration_time属性仅控制通知从操作中心归档/移除的时间,完全不影响通知在屏幕上的弹出停留时长。
最优实现:定时主动调用Dismiss方法
不需要修改系统设置,也不需要特殊的Toast模板适配,直接在通知展示后启动定时任务,到达指定时长主动调用Toast实例的dismiss()方法强制关闭即可,该方案不受系统全局时长限制,支持自定义任意短的显示时长(比如1秒甚至更短)。
修正后的可运行代码:
from winsdk.windows.ui.notifications import ToastNotificationManager, ToastNotification, ToastTemplateType import threading import datetime def toast_notification(AppID, title, text, display_seconds=1): # 加载Toast模板 toast_xml = ToastNotificationManager.get_template_content(ToastTemplateType.TOAST_TEXT02) text_nodes = toast_xml.get_elements_by_tag_name("text") text_nodes[0].append_child(toast_xml.create_text_node(title)) text_nodes[1].append_child(toast_xml.create_text_node(text)) notifier = ToastNotificationManager.create_toast_notifier(AppID) toast = ToastNotification(toast_xml) # 保留过期时间设置,避免通知残留在操作中心 toast.expiration_time = datetime.datetime.now() + datetime.timedelta(seconds=display_seconds) notifier.show(toast) # 定时主动关闭屏幕上的通知 def auto_dismiss(): toast.dismiss() # 用守护线程执行定时任务,不阻塞主程序退出 dismiss_timer = threading.Timer(display_seconds, auto_dismiss) dismiss_timer.daemon = True dismiss_timer.start() if __name__ == '__main__': # 最后一个参数传入想要的屏幕显示时长,单位为秒 toast_notification('Visual Studio Code', '自定义时长通知', '这条通知只会在屏幕显示1秒', display_seconds=1)
注意事项
- 不要将Toast的
scenario属性设置为alarm、reminder或incomingCall,这类高优先级场景的通知默认会常驻屏幕直到用户交互,会导致自动关闭失效。 - 定时任务必须设置为守护线程,否则主程序退出时如果定时器还没触发,会导致进程残留。
内容的提问来源于stack exchange,提问作者Digital Farmer
相关产品推荐
相关产品推荐

