VSTO Outlook:如何仅在撰写/回复/转发窗口显示custom taskpane
Outlook自定义任务窗格仅在邮件撰写/回复/转发窗口显示的实现方法
根据你使用的开发框架不同,分两种场景配置即可:
基于Office Web Add-in(跨平台外接程序)开发
这是目前微软支持全平台Outlook(Windows桌面、Mac、网页端)的开发模式,做两层控制就能完全符合要求:
- 清单文件前置过滤
找到加载项XML清单中VersionOverrides节点下对应自定义任务窗格的ExtensionPoint配置,做两个调整:- 把扩展点挂载到
MessageComposeCommandSurface(邮件撰写界面命令区)下,不要关联读邮件场景的MessageReadCommandSurface节点 - 在扩展点内部添加匹配规则,仅识别编辑态的邮件项,配置示例:
配置完成后Outlook会自动在新邮件撰写、回复、转发三类编辑窗口才加载你的任务窗格入口,读邮件、日历、联系人等界面不会出现加载项入口。<Rule xsi:type="ItemIs" ItemType="Message" FormType="Edit" /> - 把扩展点挂载到
- 运行时兜底校验
为了覆盖内嵌回复、窗体状态切换等边界场景,在任务窗格的初始化代码里加一层判断,不符合场景直接隐藏窗格:Office.onReady(() => { const currentItem = Office.context.mailbox.item; // 非邮件类型、非编辑状态直接隐藏任务窗格 if (currentItem.itemType !== Office.MailboxEnums.ItemType.Message || currentItem.displayMode !== Office.MailboxEnums.DisplayMode.Edit) { Office.addin.hide(); return; } // 执行你原有的自定义消息渲染逻辑 });
基于VSTO COM加载项(仅Windows桌面版)开发
如果是传统VSTO插件,没有清单层面的场景过滤能力,需要通过Outlook对象模型的事件动态控制窗格显示:
- 全局注册两个核心事件监听:
Application.Inspectors.NewInspector:捕获弹出式的新邮件、回复、转发独立窗口Application.ActiveExplorer().InlineResponse:捕获主界面内未弹出新窗口的内嵌回复/转发场景
- 事件触发时校验当前激活的项:确认是
MailItem类型,且Sent属性值为false(即未发送的编辑态邮件,排除已收到、已发送的只读邮件),此时才创建/显示对应自定义任务窗格;其余所有场景下将任务窗格的Visible属性设为false。 - 额外绑定编辑态邮件的
Send、Close事件,在邮件发送完成、窗口关闭时及时隐藏并回收对应任务窗格实例,避免内存泄漏和异常显示。
内容的提问来源于stack exchange,提问作者Willy
相关产品推荐
相关产品推荐

