C# Outlook联系人项目删除事件

C# Outlook联系人项目删除事件,c#,events,add-in,outlook-addin,C#,Events,Add In,Outlook Addin,目前我正在为GMail联系人和outlook编写一个同步工具,但有一个小问题: 当用户删除联系人时,我的加载项中需要一个事件,否则同步工具将在outlook端检测到丢失的联系人,并且该工具将从google端创建联系人 我正在使用以下代码从默认文件夹访问所有Outlook联系人: Microsoft.Office.Interop.Outlook.NameSpace mapiNamespace = GetCurrentNamespace(); Microsoft.Office.Interop.Out

目前我正在为GMail联系人和outlook编写一个同步工具,但有一个小问题: 当用户删除联系人时,我的加载项中需要一个事件,否则同步工具将在outlook端检测到丢失的联系人,并且该工具将从google端创建联系人

我正在使用以下代码从默认文件夹访问所有Outlook联系人:

Microsoft.Office.Interop.Outlook.NameSpace mapiNamespace = GetCurrentNamespace();
Microsoft.Office.Interop.Outlook.MAPIFolder contacts = mapiNamespace.GetDefaultFolder(Microsoft.Office.Interop.Outlook.OlDefaultFolders.olFolderContacts);

IList<Microsoft.Office.Interop.Outlook.ContactItem> items = new List<Microsoft.Office.Interop.Outlook.ContactItem>();

foreach (var contact in contacts.Items)
{
    items.Add(contact as Microsoft.Office.Interop.Outlook.ContactItem);
}

return items;
Microsoft.Office.Interop.Outlook.NameSpace mapiNamespace=GetCurrentNamespace();
Microsoft.Office.Interop.Outlook.MAPIFolder contacts=mapiNamespace.GetDefaultFolder(Microsoft.Office.Interop.Outlook.OlDefaultFolders.olFolderContacts);
IList items=新列表();
foreach(contacts.Items中的var联系人)
{
items.Add(以Microsoft.Office.Interop.Outlook.ContactItem的身份联系);
}
退货项目;
编辑1: 正如约翰·桑德斯评论的那样,我已经尝试订阅了一个BeforeDelete活动,但没有成功。当我尝试在Outlook中删除联系人时,事件不会被触发

代码:

Microsoft.Office.Interop.Outlook.NameSpace mapiNamespace=GetCurrentNamespace();
_contactMapiFolder=mapiNamespace.GetDefaultFolder(Microsoft.Office.Interop.Outlook.OlDefaultFolders.olFolderContacts);
//IList items=新列表();
这是。_contacts=新列表();
foreach(在_contactMapiFolder.Items中的var contact)
{
Outlook.ContactItem item=联系人身份为Microsoft.Office.Interop.Outlook.ContactItem;
item.BeforeDelete+=ItemOnBeforeDelete;
此._contacts.Add(项目);
}
将此返回。\u联系人;

有人能给我举个例子吗?这些mapi(特别是联系人文件夹)文件夹中有哪些事件可用,以及它们是如何工作的?

在文件夹中的每个项目上设置事件接收器是一个非常糟糕的主意

当Items.ItemRemove甚至激发时,您无法确定删除了哪个项目。您别无选择,只能将当前集合与服务器上或某种本地缓存中的集合进行比较


您可以尝试使用及其.ItemRemove事件-它从文件夹内容表中传递PR_INSTANCE_KEY MAPI属性的值。如果您提前缓存所有项目的PR_INSTANCE_KEY属性的值(您可以使用RDOITems.MAPITable.ExecSQL进行缓存),则可以确定删除了哪个项目,而无需遍历文件夹中的所有项目。

我已编辑了您的标题。请参阅“”,其中的共识是“不,他们不应该”。对不起,我不知道:\n是的,我读了一些msdn文章和文档,但office addin开发文档的文档不是很好。我正在搜索默认联系人文件夹的ItemDeleted或BeforeItemDeleted,在Microsoft.Office.Interop.Outlook.MAPIFolder对象中没有定义任何事件。是的,这就是问题所在:如果google不通知我用户删除了联系人,我将无法在Outlook中删除该联系人。删除联系人对象没有问题,但要从outlook获取事件,这是一个问题。嗯,好吧,这可能是一个解决方案,但我不想要,所以买一个外部工具,你可以选择1。使用Items.ItemRemove事件作为触发器,将当前文件夹项目与缓存协调,以确定删除了哪些项目。2.切换到扩展MAPI(C++或Delphi),当fnevTableModified/TABLE\u ROW\u删除事件firesMy 2美分时,该属性将为您提供PR\u INSTANCE\u KEY属性,WhiteIntel:Redemption是Outlook开发的重要工具。14年来,我一直在构建Outlook解决方案,并在90%的项目中使用它。它具有很多功能,可以节省您的时间。
Microsoft.Office.Interop.Outlook.NameSpace mapiNamespace = GetCurrentNamespace();
_contactMapiFolder = mapiNamespace.GetDefaultFolder(Microsoft.Office.Interop.Outlook.OlDefaultFolders.olFolderContacts);

//IList<Microsoft.Office.Interop.Outlook.ContactItem> items = new List<Microsoft.Office.Interop.Outlook.ContactItem>();
this._contacts = new List<Microsoft.Office.Interop.Outlook.ContactItem>();

foreach (var contact in _contactMapiFolder.Items)
{
    Outlook.ContactItem item = contact as Microsoft.Office.Interop.Outlook.ContactItem;
    item.BeforeDelete += ItemOnBeforeDelete;
    this._contacts.Add(item);
}

return this._contacts;