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

C# 如何知道删除了哪个Outlook日历项目?,c#,outlook,C#,Outlook,创建和/或删除新Outlook日历项目时,以下代码会发出警报: static void Main(string[] args) { var oApp = new Application(); var mapiNamespace = oApp.GetNamespace("MAPI"); var CalendarFolder = mapiNamespace.GetDefaultFolder(OlDefaultFolders.olFolderCalendar

创建和/或删除新Outlook日历项目时,以下代码会发出警报:

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
不提供已删除的实际项目


我如何知道哪个项目已被删除(例如,告诉其主题)?

此事件异步激发,因此当
itemrove
事件激发时,该项目已消失。即使在MAPI级别,当文件夹内容表触发
fnevTableModified | table|ROW_DELETED
通知时,它也只提供
PR_INSTANCE_KEY
属性的值(您可以在-click IMAPIFolder中看到它,转到GetContentsTable表,删除项目时查看页面底部的日志)

如果使用是一个选项,则可以使用。
ItemRemove
event-它将
PR\u INSTANCE\u KEY
的值作为参数传递

PR_INSTANCE_KEY
仅当您已经缓存了文件夹中所有项目的属性值,或者至少是您感兴趣的项目的属性值时才有用。请记住,它不能被缓存-它仅对目录表的特定实例有效(
IMAPITable

还要记住,所有项目事件都是为UI目的而设计的,它们不应用于任何类型的同步


如果使用事件进行同步,您可以选择使用
ItemRemove
事件作为提示,提示同步必须尽早运行,并循环存储区中的所有项目以确定更改了哪些项目,或者在Exchange的情况下,您可以使用增量更改同步API(ICS)。它作为赎罪对象公开。

感谢您的详细回答。所以我的选择是要么安装第三方工具(“赎回”),要么运行整个重新同步?是的。或者在C++或Delphi中使用扩展的MAPI。我找不到兑换许可证。你有可能提到它吗?你是指EULA吗?它在。可分发版本EULA位于