Outlook VSTO开发:会议保存时检查MeetingItem Body的问题
解决Outlook VSTO插件中会议保存时检查并修改Body的问题
问题根源
你之前监听MeetingItem.Write事件无效的核心原因是:用户编辑会议时操作的是AppointmentItem(约会项),而非MeetingItem。MeetingItem是会议请求发送后生成的邮件对象,仅在发送流程中出现;而编辑、保存会议窗口时,实际操作的是AppointmentItem(当AppointmentItem.MeetingStatus为olMeeting时就是会议)。
解决方案
监听AppointmentItem的Write事件,该事件会在会议保存(包括手动点击保存、关闭窗口自动保存)时触发。以下是完整实现代码:
private void ThisAddIn_Startup(object sender, EventArgs e) { // 保留原有的发送事件监听 Application.ItemSend += Application_ItemSend; // 监听项加载事件,绑定约会项的Write事件 Application.ItemLoad += Application_ItemLoad; } private void Application_ItemLoad(object item) { // 判断是否为约会项(会议属于约会项的一种) if (item is AppointmentItem appointmentItem) { // 绑定Write事件 appointmentItem.Write += AppointmentItem_Write; } } private void AppointmentItem_Write(object sender, ref bool Cancel) { // 将sender转换为AppointmentItem if (sender is not AppointmentItem appointmentItem) return; // 仅针对会议处理(可选,若需包含普通约会可删除此判断) if (appointmentItem.MeetingStatus != OlMeetingStatus.olMeeting) return; // 检查Body是否为空或空白 if (string.IsNullOrWhiteSpace(appointmentItem.Body)) { // 添加你的修改逻辑,例如设置默认正文 appointmentItem.Body = "会议默认正文内容"; // 无需手动调用Save(),Write事件触发时修改的内容会自动被保存 } } // 保留原有的发送事件处理逻辑 private void Application_ItemSend(object item, ref bool cancel) { if (item is MeetingItem meetingItem) { // 你的原有发送处理代码 } }
关键说明
- 事件触发场景:
AppointmentItem.Write事件会在手动点击「保存」、关闭会议窗口自动保存、代码调用Save()方法时触发,完全覆盖你的需求场景。 - 内存泄漏注意:如果插件长期运行,建议使用弱事件模式(如
WeakEventManager)绑定事件,避免因未释放引用导致的内存泄漏。 - 会议过滤:通过
MeetingStatus判断可确保仅处理会议项,若需包含普通约会可移除该判断。
内容的提问来源于stack exchange,提问作者Gadzhik
相关产品推荐
相关产品推荐

