如何知道删除了哪个 Outlook 日历项目?

How to know which Outlook Calendar item was deleted?

以下代码在创建新的 Outlook 日历项目时发出警报 and/or 已删除:

static void Main(string[] args)
{
    var oApp = new Application();
    var mapiNamespace = oApp.GetNamespace("MAPI");
    var CalendarFolder = mapiNamespace.GetDefaultFolder(OlDefaultFolders.olFolderCalendar);
    var outlookCalendarItems = CalendarFolder.Items;
    outlookCalendarItems.ItemAdd += item => Console.WriteLine($"Created: {(item as AppointmentItem).Subject}");
    outlookCalendarItems.ItemRemove += () => Console.WriteLine($"Removed: ...?");

    Console.WriteLine("Done.");
    Console.ReadLine();
}

问题是 outlookCalendarItems.ItemRemove 没有提供被删除的实际项目...

我怎么知道哪个项目被删除了(例如告诉它的主题)?

此事件异步触发,因此在 ItemRemove 事件触发时,该项目已经消失。即使在 MAPI 级别,当文件夹内容 table 触发 fnevTableModified | TABLE_ROW_DELETED 通知时,它仅提供 PR_INSTANCE_KEY 属性 的值(您可以看到它在 OutlookSpy(我是它的作者)中 - 单击 IMAPI 文件夹,转到 GetContentsTable table,在删除项目时查看页面底部的日志)。

如果使用 Redemption is an option (I am also its author), you can use RDOItemsItemRemove 事件 - 它会传递 PR_INSTANCE_KEY 的值作为参数。

PR_INSTANCE_KEY 仅当您已经为文件夹中的所有项目或至少您感兴趣的项目缓存了 属性 的值时才有用。请记住PR_INSTANCE_KEY 无法在会话之间缓存 - 它仅对内容的特定实例有效 table (IMAPITable).

另请记住,所有项目事件仅用于 UI 目的,不应将它们用于任何类型的同步 - 它们可能会在重负载下被丢弃。

如果您使用该事件进行同步,您的选择是使用 ItemRemove 事件作为您的同步必须 运行 尽快而不是稍后的提示,并循环遍历商店中的所有项目以找出更改的项目,或者,如果是 Exchange,您可以使用增量更改同步 API (ICS)。它在 Redemption 中作为 RDOFolderSynchronizer 对象公开。