【发布时间】: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