VSTO-Add-In Outlook自定义Toastnotification导致邮件通知点击失效如何解决
问题根因
- 你调用
ToastNotificationManagerCompat相关API时,默认复用了Outlook的应用用户模型ID(AUMID)作为通知发送方标识,系统会将所有该AUMID发出的通知(包括Outlook原生的新邮件通知)的激活事件都路由到你注册的OnActivated回调中,未匹配到你的业务逻辑的激活事件没有做后续转发,导致原生邮件通知点击无响应。 ToastNotificationManagerCompat会在系统注册表写入激活处理相关的关联配置,你卸载VSTO插件时没有主动清理这些配置,导致系统仍然尝试将Outlook通知的激活请求路由到已不存在的插件处理逻辑,调用Outlook时传入了无效参数触发报错。- 代码中额外存在逻辑漏洞:字符串替换时先做了
ToLower()再替换大写的idEPST=,会导致参数匹配永远失败,Excel启动参数也多加了无意义的斜杠,会导致文件打开失败。
修复方案
1. 发送通知时指定专属AUMID,避免与Outlook原生标识冲突
调用Show()方法时指定你的插件专属的唯一AUMID,和Outlook原生通知的路由完全隔离:
new ToastContentBuilder() .AddAudio(null, silent: true) .AddArgument("idEPST", filename) .AddHeader("identifier", "My Excel App Name", String.Empty) .AddText($"{name}, {firstname}", hintMaxLines: 1) .AddText("... sucessfully saved.") .Show(toast => { // 替换为你自己的专属唯一标识,格式建议为 公司名.产品名.插件名 toast.ApplicationId = "MyCompany.PDFImporterAddIn"; });
2. 调整激活事件注册逻辑,避免拦截非自身通知
不要在异步Task中注册事件避免重复注册,同时简化参数判断逻辑:
public Ribbon1() { // 直接在构造函数注册事件 ToastNotificationManagerCompat.OnActivated += ToastActivatedHandler; } private async void ToastActivatedHandler(ToastNotificationActivatedEventArgsCompat toastArgs) { ToastArguments args = ToastArguments.Parse(toastArgs.Argument); // 仅处理自身业务的通知参数 if (args.TryGetValue("idEPST", out string datei) && !string.IsNullOrEmpty(datei)) { datei = datei.Trim().Replace(".xls", "", StringComparison.OrdinalIgnoreCase); ProcessStartInfo si = new ProcessStartInfo() { FileName = "excel.exe", // 修正Excel启动参数格式 Arguments = $"\"C:\\folder\\{datei}.xls\"" }; Process.Start(si); } // 非自身通知不需要做任何处理,系统会自动走原生激活逻辑 }
3. 新增卸载清理逻辑
在VSTO插件的ThisAddIn_Shutdown事件、或者安装程序的卸载逻辑中加入清理代码,移除系统中的激活关联配置:
// 插件关闭/卸载时调用,清除所有注册的Toast相关配置 ToastNotificationManagerCompat.Uninstall();
4. 修复已损坏的现有环境
如果已经卸载插件且出现命令行报错,手动删除注册表中对应路径即可恢复:
HKEY_CURRENT_USER\Software\Classes\AppUserModelId<你之前使用的AUMID,默认是Outlook的AUMID或者自定义的插件标识>
删除后重启电脑即可恢复Outlook原生通知的点击功能。
内容的提问来源于stack exchange,提问作者ProbeStream
相关产品推荐
相关产品推荐

