C# 将项目移动到Outlook VSTO的特定文件夹时附加事件侦听器

C# 将项目移动到Outlook VSTO的特定文件夹时附加事件侦听器,c#,visual-studio,outlook,vsto,outlook-addin,C#,Visual Studio,Outlook,Vsto,Outlook Addin,我想要实现的是,当用户将项目从Outlook中的任何文件夹(收件箱、垃圾邮件、草稿等)移动到特定的用户创建文件夹(例如“abc”)时,附加一个事件侦听器 在这个阶段,我只想在项目移动到文件夹“abc”时显示“Hello World” 我知道我可能可以利用文件夹。BeforeItemMove事件,但该事件用于从特定文件夹移动项目时,并且我希望在项目移动到特定文件夹时使用该事件。 我也尝试了FolderChangeevent,这很有意义,因为它在文件夹中发生事件时触发。但是它的事件处理程序只带有一个

我想要实现的是,当用户将项目从Outlook中的任何文件夹(收件箱、垃圾邮件、草稿等)移动到特定的用户创建文件夹(例如“abc”)时,附加一个事件侦听器

在这个阶段,我只想在项目移动到文件夹“abc”时显示“Hello World”

我知道我可能可以利用
文件夹。BeforeItemMove
事件,但该事件用于从特定文件夹移动项目时,并且我希望在项目移动到特定文件夹时使用该事件。

我也尝试了
FolderChange
event,这很有意义,因为它在文件夹中发生事件时触发。但是它的事件处理程序只带有一个
文件夹
参数,而不是像
EventArgs
那样的参数,因此我无法区分用户操作(是否添加、移动、删除等)

我的解决方法是使用
此加载项启动中的循环将
文件夹.BeforeItemMove
事件添加到除“abc”之外的每个文件夹中

foreach(Folder f in folders)
{
 f.BeforeItemMove += new Microsoft.Office.Interop.Outlook.MAPIFolderEvents_12_BeforeItemMoveEventHandler(BeforeItemMove);
}
但它只工作一次,而不是整个生命周期。我知道这可能是因为我没有在类级别声明收集到的所有文件夹属性,但我如何才能做到这一点?如果我只需要说“收件箱”,我就可以了

Folder Inbox

private void ThisAddIn_Startup(object sender, System.EventArgs e)
    {
        Folderroot = (Folder)this.Application.Session.DefaultStore.GetRootFolder();
        inbox = root.Folders["Inbox"];
        inbox.BeforeItemMove += new Microsoft.Office.Interop.Outlook.MAPIFolderEvents_12_BeforeItemMoveEventHandler(BeforeItemMove);
    }
这样,GC就不会收集“收件箱”文件夹但我不知道如何处理需要监控多个文件夹的情况。


我的思路正确吗?还是有更好的解决方案?

看起来您对Items类的事件很感兴趣。将一个或多个项添加到指定集合时,将激发该命令。如果同时向文件夹中添加了大量项目(超过十六个),则不会运行此事件


必须在代码中分别订阅每个文件夹/项目,才能获取所有文件夹的事件。

创建一个包装类,该类接受
项目
对象并存储为类成员。将该对象的
Items.ItemAdd
事件处理程序设置为该包装器类中的方法。在外接程序中,使用包装器列表(
list)
存储要监视的每个文件夹的Items集合的包装器。这些方法将防止对象被垃圾收集

“我也尝试过FolderChangeevent,但它会触发多个事件,而不仅仅是“移入”,对我来说这是最有意义的,您可以检查EventArgs对象以查看它代表什么,如果它是文件移动,请执行您的逻辑,否则忽略它。@RyanWilson FolderChange事件处理程序似乎没有附带EventArgs参数,它只有Folder参数,Folder I无法区分操作类型(移动、重命名、删除等)难道你不能跟踪文件夹的计数,然后如果它发生变化,你可以确定某些文件已被移动到其中吗?@RyanWilson似乎是正确的。现在,我声明一个全局计数,并在每次项目更改激发时对照全局检查本地计数,我还将在删除和添加时对其进行更新。虽然有点枯燥,但它似乎可以工作。我简要浏览了Outlook API文档,这是我在不做太多研究的情况下所能想到的最好方法。很高兴它能为您工作。我是否监视项目将要移出的所有文件夹?或者只是“abc”文件夹中的项目将要移动?在阅读文档后,我更倾向于后者,但我认为你是在建议正式的?我不确定你的意思-你是指商店中的所有文件夹,而不是仅指可以移动邮件的文件夹?后者当然更有效。很抱歉造成混淆,我指的是所有可能被移出的文件夹(如收件箱、垃圾邮件、删除)。或者我可以只监视目标文件夹(在我的例子中是“abc”?),该文件夹将接收来自所有其他潜在文件夹的项目。我不确定如果不进行大量实验,该文档对我来说不是太清楚。如果该项目可能被移动到任何文件夹,最好完全避免事件发生,只需定期扫描文件夹,查看是否添加了任何内容。