我有一个与 VS 2010 一起使用了一段时间的小型 VSTO add-in。即将迁移到 Office 2013/Outlook 2013,因此 add-in 必须为 re-written 才能与 Outlook 2013 一起使用。
Outlook add-in 由自定义功能区按钮触发。触发后,add-in 将创建一个新的会议请求窗口,并在消息正文中填充一些自定义内容。之后,用户可以完成会议请求并根据需要发送会议请求。
我当前遇到的问题是,以前,此消息窗口是使用 CommandBarControl 对象创建的,以编程方式触发了 Outlook 中“新会议”按钮的单击。这在早期版本的 Outlook 但我收集到 CommandBarControl 对象已从 Outlook 2013 中删除中有效,现在却静默失败。这确实是我所看到的。
用于创建新会议请求的原始代码是这样的:
Explorer activeExplorer = Globals.ThisAddIn.Application.ActiveExplorer();
CommandBarControl commandBarControl = activeExplorer.CommandBars.FindControl(Type.Missing, 1106);
commandBarControl.Execute();
appointmentItem = (AppointmentItem)Globals.ThisAddIn.Application.ActiveInspector().CurrentItem;
appointmentItem.MeetingStatus = OlMeetingStatus.olMeeting;
appointmentItem.RTFBody = message; // message is a byte array being passed in from elsewhere.
FindControl()方法用于在 Outlook 中找到“新会议”按钮,然后 Execute()在该按钮上单击操作。
另一种可能是这样的:
appointmentItem = (AppointmentItem)Globals.ThisAddIn.Application.CreateItem(OlItemType.olAppointmentItem);
appointmentItem.MeetingStatus = OlMeetingStatus.olMeeting;
appointmentItem.RTFBody = message; // message is a byte array being passed in from elsewhere.
appointmentItem.Display(false);
第二个代码块还将创建一个新的会议请求窗口,并在 Outlook 2013 中运行,但是第二个代码块有一些细微但重要的区别...
-
创建的会议请求将不会继承用户先前在其日历中单击的日期和时间,而是默认为当前的 date/time,无论用户在其日历中单击了什么 date/time。
-
创建的会议请求将不考虑用户正在“代表”另一个用户创建会议请求的情况,因为它会忽略用户发起新的会议请求之前已单击哪个日历。
所以我的问题是:现在如何在 Outlook 2013 中以编程方式(使用 VSTO add-in)创建一个新的会议请求,该请求将尊重用户事先单击的日历?也就是说,它将满足以前使用 CommandBarControl 对象设法满足的上述两个要求吗?
1 回答
没错,Office 2010 中不建议使用命令栏。现在改用 Fluent UI。您可以在以下系列文章中阅读有关新 UI 的更多信息:
为开发人员自定义 2007 Office Fluent 功能区(第 1 部分,共 3 部分)
为开发人员自定义 2007 Office Fluent 功能区(第 2 部分,共 3 部分)
为开发人员自定义 2007 Office Fluent 功能区(第 3 部分,共 3 部分)
您可以使用CommandBars.ExecuteMso方法以编程方式运行所需的功能区按钮(请参阅 Explorer 和 Inspector 类的 CommandBars 属性)。您只需要传递需要运行的 built-in 控件的 idMso 值即可。以下链接提供了 Office 2010 和 2013 的 built-in 控件的列表:
Office 2010 帮助文件:Office Fluent 用户界面控件标识符
Office 2013 帮助文件:Office Fluent 用户界面控件标识符