【问题标题】:attach an event listener when an item is moved to a particular folder Outlook VSTO将项目移动到特定文件夹时附加事件侦听器 Outlook VSTO
【发布时间】:2018-11-28 09:17:42
【问题描述】:

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

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

我知道我可能可以利用 Folder.BeforeItemMove 事件,但该事件适用于将项目从特定文件夹移动时,我想要将项目移动到特定文件夹时的事件。

我也试过FolderChangeevent,这是有道理的,因为它会在文件夹中发生事情时触发。但它的事件处理程序只带有一个Folder 参数,而不是像EventArgs 这样的东西,所以我无法区分用户操作(无论是添加、移动、删除等)

我的解决方法是使用ThisAddIn_Startup 中的循环将Folder.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 收集。 但是当需要监控多个文件夹时,我不知道如何处理。

我是在正确的轨道上还是有更好的解决方案?

【问题讨论】:

  • “我也尝试过 FolderChangeevent,但它会触发多个事件,而不仅仅是“移入””,对我来说这是最有意义的,如果您可以检查 EventArgs 对象以查看它代表什么这是一个文件移动按照你的逻辑,否则就忽略它。
  • @RyanWilson,FolderChange 事件处理程序似乎没有附带 EventArgs 参数,它仅带有 Folder 参数,文件夹我无法区分操作的类型(移动、重命名、删除等)跨度>
  • 你不能只跟踪文件夹的计数,然后如果它发生变化,你可以确定一些文件已经移入其中吗?
  • @RyanWilson 似乎是正确的。我现在声明一个全局计数,并在每次触发项目更改时根据全局检查本地计数,我还在删除和添加时更新它。有点乏味,但它似乎工作。
  • 我简要浏览了 Outlook API 文档,这是我在没有太多研究的情况下能想到的最好的方法。很高兴它对你有用。

标签: c# visual-studio outlook vsto outlook-addin


【解决方案1】:

您似乎对 Items 类的 ItemAdd 事件感兴趣。当一个或多个项目添加到指定的集合中时会触发它。一次将大量项目(超过 16 个)添加到文件夹时,不会运行此事件。

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

【讨论】:

    【解决方案2】:

    创建一个包装类,该类接受一个Items 对象并存储为类成员。为该对象设置一个Items.ItemAdd 事件处理程序作为该包装类中的方法。在您的插件中,使用包装器列表(List<MyWrapper>) 来存储您要监控的每个文件夹的 Items 集合的包装器。这样可以防止 Items 对象被垃圾收集。

    【讨论】:

    • 我是否监控项目要移出的所有文件夹?或者只是项目要移入的“abc”文件夹?阅读文档后,我更倾向于后者,但我认为您建议的是正式的?
    • 我不确定您的意思 - 您是指商店中的 所有 文件夹还是仅可能移动邮件的文件夹?后者当然效率更高。
    • 很抱歉造成混淆,我的意思是项目可能被移出的所有潜在文件夹(如收件箱、垃圾邮件、删除)。或者我可以只监视目标文件夹(在我的情况下为“abc”?),即该文件夹将从所有其他潜在文件夹中接收项目。我不确定没有太多实验该走哪条路,文档不太清楚我。
    • 如果该项目可能被移动到任何文件夹,最好完全避免事件并定期扫描文件夹以查看是否添加了任何内容。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多