C# 如何知道删除了哪个Outlook日历项目?
创建和/或删除新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
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位于