如何捕获OutlookContact.Write事件?

4

我正在尝试钩取Application.ItemLoad事件的方法:

private void ThisAddIn_Startup(object sender, System.EventArgs e)
{
    this.Application.ItemLoad += new Microsoft.Office.Interop.Outlook.ApplicationEvents_11_ItemLoadEventHandler(Application_ItemLoad);
}

这将检查当前项目是否为ContactItem。如果是ContactItem,它会检查属性ContactItem.User4是否包含值xxx。如果ContactItem.User4包含值xxx,则它会钩住另一个方法,并将其与ContactItem.Write事件关联:

void Application_ItemLoad(object Item)
        {
            if (Item is Outlook.ContactItem)
            {
                Outlook.ContactItem contact = (Outlook.ContactItem)Item;
                System.Windows.Forms.MessageBox.Show("A new contact is loaded into memory");

                try
                {
                    string user4 = contact.User4;
                    bool isSynchronized =  user4 != null && user4.Contains("xxx");

                    if (isSynchronized)
                    {
                        contact.Write += propertyChangeHandler;
                    }
                }
                catch (Exception e)
                {
                    System.Windows.Forms.MessageBox.Show("An error occurred: "+e);
                }
            }
        }

现在的问题是,每当我尝试访问ContactItem.User4属性时,都会出现异常:

System.Runtime.InteropServices.COMException:该项的属性和方法不能在此事件过程中使用。

我应该怎么做才能避免上述错误?

感谢您阅读我的长篇问题,并期待您的建议。

1个回答

2

您需要使用不同的事件。根据这篇文章 - 项目的内容尚未加载到内存中。您应该查看Application.Inspectors事件NewInspector


感谢您的回复。在执行Application_ItemLoad步骤时,使用NewInspector事件的问题是propertyChangeHandler与ContactItem.Write事件挂钩多次。我们能否确保它只被挂钩一次? - craftsman
在检查器关闭后,您应该断开处理程序。使用((Outlook.InspectorEvents_10_Event)inspector).Close += new Outlook.InspectorEvents_10_CloseEventHandler(Inpsector_Close); - SliverNinja - MSFT
这段代码应该放在哪里?如果我把它插入到NewInspector事件处理程序中,CloseEventHandler将会多次附加到一个检查员上。另外,Inspector_Close回调方法没有任何参数。即使我将此方法与Close事件关联,我如何获取当前检查员或需要断开处理程序的写入事件所属项的引用呢? - craftsman
1
@craftsman 你需要实现一个检查器包装器 http://msdn.microsoft.com/zh-cn/library/ff973716.aspx - SliverNinja - MSFT
@SilverNinja 非常感谢您的建议。InspectorWrapper非常好用。 - craftsman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接