如何获得项目刚刚在Outlook中删除
本文关键字:删除 Outlook 项目 何获得 | 更新日期: 2023-09-27 18:06:35
我想在outlook插件中每次删除约会时获取项目对象。问题是ItemRemoveEventHandler委托不返回被删除的项目,与ItemAddEventHandler或ItemChangeEventHandler相反。我试过一些代码片段,但没有一个是工作的。一个糟糕的解决方案是在垃圾桶文件夹(Outlook.OlDefaultFolders.olFolderDeletedItems)上附加一个ItemAddEventHandler。这也不工作,因为项目没有移动到垃圾文件夹,但删除/添加:所以EntryID(唯一密钥标识符)是不一样的…
有没有人有一段代码在被删除之前获得项目?
这些事件异步触发,所以当ItemRemove
事件触发时,项目已经消失了。即使在MAPI级别上,当文件夹内容表触发fnevTableModified | TABLE_ROW_DELETED通知时,它只提供PR_INSTANCE_KEY属性的值(您可以在OutlookSpy中看到它-我是它的作者-单击IMAPIFolder,转到GetContentsTable表,当您删除一个项目时,查看页面底部的日志)。
如果可以使用Redemption(我也是它的作者),则可以使用RDOItems。ItemRemove事件——它传递PR_INSTANCE_KEY的值作为参数。
PR_INSTANCE_KEY只有在您已经缓存了文件夹中所有项的属性值,或者至少是您感兴趣的项的属性值时才有用。请记住,PR_INSTANCE_KEY不能被缓存——它只对内容表(IMAPITable
)的一个特定实例有效。
还要记住,所有的item事件都是为UI目的而设计的,它们不应该用于任何类型的同步。
如果您使用事件进行同步,您的选择是使用ItemRemove
事件作为您的同步必须尽快运行的提示,并循环遍历存储中的所有项目以找出哪个项目更改了,或者,在Exchange的情况下,您可以使用增量更改同步API (ICS)。它公开为Redemption中的RDOFolderSynchronizer对象
尝试使用Folder.BeforeItemMove
并检查参数MoveTo
的值,这是一个MAPIFolder
。MoveTo.StoreID
应该与删除项的默认文件夹相同。对于shift + delete(永久删除),MoveTo
应该等于null
。
private void BeforeItemMove(object Item, MAPIFolder MoveTo, ref bool Cancel)
{
AppointmentItem appointment = (AppointmentItem)Item;
Folder deletedItemsFolder =
(Folder)Application
.Session
.GetDefaultFolder(OlDefaultFolders.olFolderDeletedItems);
if(MoveTo == null || MoveTo.StoreID == deletedItemsFolder.StoreID)
{
// Do something...
}
Marshal.ReleaseComObject(deletedItemsFolder);
deletedItemsFolder = null;
Marshal.ReleaseComObject(appointment);
appointment = null;
}
我得到了这个想法从问题BeforeItemMove事件没有在Outlook中触发当项目被删除在远程机器上