【问题标题】:Outlook ContactItem DeleteEventOutlook 联系人项目删除事件
【发布时间】:2022-05-03 23:17:20
【问题描述】:

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

我正在使用此代码从默认文件夹访问所有 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;

编辑 1: 正如 John Saunders 所说,我已经尝试订阅一个 BeforeDelete 事件,但没有成功。当我尝试在 Outlook 中删除联系人时,该事件不会被触发。

代码:

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;

谁能给我一个例子,哪些事件可用于此类 mapi(尤其是联系人文件夹)文件夹可用以及它们是如何工作的?

【问题讨论】:

  • 我已经编辑了你的标题。请参阅“Should questions include “tags” in their titles?”,其中的共识是“不,他们不应该”。
  • 抱歉,不知道:\
  • 是的,我阅读了一些 msdn 文章和文档,但 Office 插件开发文档的文档记录不是很好
  • 我正在为默认联系人文件夹搜索 ItemDeleted 或 BeforeItemDeleted,在 Microsoft.Office.Interop.Outlook.MAPIFolder 对象中没有定义任何事件。
  • 是的,这就是问题所在:stackoverflow.com/questions/27508640/… 如果谷歌没有通知我用户删除了联系人,我无法在 Outlook 中删除联系人。删除一个联系人对象没问题,但是从outlook中获取一个事件就可以了。

标签: c# events add-in outlook-addin


【解决方案1】:

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

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

您可以尝试使用Redemption(我是它的作者)及其RDOItems.ItemRemove 事件 - 它从文件夹目录表中传递PR_INSTANCE_KEY MAPI 属性的值。如果您提前缓存了所有项目的PR_INSTANCE_KEY 属性值(您可以为此使用RDOITems.MAPITable.ExecSQL),则无需遍历文件夹中的所有项目即可确定删除了哪个项目。

【讨论】:

  • 嗯好吧,这可能是一个解决方案,但我不想购买外部工具
  • 您可以 1. 使用 Items.ItemRemove 事件作为触发器,将当前文件夹项目与您的缓存相协调,以确定哪个项目被删除。 2. 切换到扩展 MAPI(C++ 或 Delphi),当 fnevTableModified / TABLE_ROW_DELETED 事件触发时,它将为您提供 PR_INSTANCE_KEY 属性
  • 我的两分钱,WhiteIntel:Redemption 恕我直言,它是 Outlook 开发的 基本 工具。 14 年来,我一直在构建 Outlook 解决方案,并在 90% 的项目中使用它。它功能丰富,可以节省您的时间。
猜你喜欢
  • 2017-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-30
  • 2012-07-29
  • 1970-01-01
相关资源
最近更新 更多