Outlook VSTO 加载项如何获取对用户启动的新约会的引用

Outlook VSTO Add-in how to get reference to a user initiated new appointment

我正在开发一个 outlook 加载项,它将客户 userProperties 保存到 outlook 约会。我可以使用 selectionChange 事件获取对现有约会的引用。

public partial class ThisAddIn
{
    Outlook.Explorer currentExplorer = null;
    private Outlook.AppointmentItem appointmentItem = null;
    private void ThisAddIn_Startup(object sender, System.EventArgs e)
    {
        currentExplorer = this.Application.ActiveExplorer();
        currentExplorer.SelectionChange += new Outlook.ExplorerEvents_10_SelectionChangeEventHandler(CurrentExplorer_Event);
   
    }


    private void CurrentExplorer_Event()
    {  

        String expMessage = "default";
        try
        {
            if (this.Application.ActiveExplorer().Selection.Count > 0)
            {
                Object selObject = this.Application.ActiveExplorer().Selection[1];
                if (selObject is Outlook.AppointmentItem)
                {
                    appointmentItem = (selObject as Outlook.AppointmentItem);
                    expMessage = "The item is an appointment. The subject is " + appointmentItem.Subject + ".";
                    MessageBox.Show(expMessage);
                }
            }
        }
        catch (Exception ex)
        {
            expMessage = "Error happened " +  ex.Message;
        }
        
    }

但是,当用户发起新约会时,this.Application.ActiveExplorer().Selection.Count 为 0。

我想看看我们如何获得对由用户触发但尚未保存的 Outlook AppointmentItem 的引用

这就是我找到解决方案的方式。当打开现有约会时,上面的代码工作正常。

对于新的约会,您可以使用 ActiveInspector 来获取对新 AppointmentItem 的引用

Outlook.AppointmentItem appointment = null;
            Outlook.Inspector inspector = Globals.ThisAddIn.Application.ActiveInspector();
            if (inspector.CurrentItem is Outlook.AppointmentItem)
                appointment = inspector.CurrentItem as Outlook.AppointmentItem;

您可以在显示新约会时使用 Inspectors.NewInspector 事件,也可以在保存新约会后在日历文件夹对应的 MAPIFolder 上使用 Items.ItemAdd 事件。

您正在尝试混合使用不同的 Outlook windows(检查器和浏览器)来获取项目。如果您需要在用户创建新的约会项目时获取项目,您需要处理 NewInspector 事件,该事件在打开新检查器 window 时触发,无论是作为用户操作的结果还是通过程序代码。您可以通过检查 EntryID 属性 来区分现有项目和新项目,其中 returns 如果是新项目则为空字符串。 EntryID 属性 值是在将项目保存到商店时设置的。

因此,无需处理当用户以编程方式或通过与用户界面交互选择不同或附加的 Microsoft Outlook 项目时触发的 SelectionChange 事件。当用户(以编程方式或通过用户界面)单击或切换到包含项目的不同文件夹时,也会发生此事件,因为 Outlook 会自动选择该文件夹中的第一个项目。

class Connect
{
    // Connect class-level Instance Variables
    // Outlook inspectors collection
    private Outlook.Inspectors inspectors;

    public Connect(Outlook.Inspectors Inspectors)
    {
        inspectors = Inspectors;
        
        // Hook up NewInspector event
        inspectors.NewInspector += new 
            Outlook.InspectorsEvents_NewInspectorEventHandler(
                inspectors_NewInspector);
    }

    // NewInspector event creates new instance of OutlookInspector
    void inspectors_NewInspector(Outlook.Inspector Inspector)
    {
        // use the CurrentItem to get the item object
        // inspector.CurrentItem
    }
 
}

所以,没有必要使用 ActiveInspector 属性.

您可能会发现 Implement a wrapper for inspectors and track item-level events in each inspector 文章有帮助。