以编程方式将事件处理程序添加到项目

3
我正在将待办事项清单中的一些项目赋予自定义属性,并希望在该属性更改时执行特定事件。是否有一种方式可以编写事件处理程序来处理olFolderToDo文件夹中所有项目的CustomPropertyChange事件,或以编程方式向项目添加事件处理程序,以便在添加新项目时添加事件处理程序?
我曾笨拙地处理过这个问题,将我的代码放在文件夹的ItemsChange事件处理程序中,然后检查属性的值(例如,当我想要在任务完成后触发操作时,我会监视项目的更改,然后检查项目是否已完成),但这不处理任意属性更改,并需要谨慎处理以避免连续多次触发。
以下是我目前所做的示例:
Public WithEvents Items As Outlook.Items

Private Sub Application_Startup()
Set Items = Application.GetNamespace("MAPI").GetDefaultFolder(olFolderToDo).Items
End Sub

Private Sub Items_ItemChange(ByVal Item As Object)
If TypeOf Item Is Outlook.TaskItem Then
    If Item.Status = olTaskComplete Then
        DoTheThing
    End If
ElseIf TypeOf Item Is Outlook.MailItem Then
    If Item.FlagStatus = olFlagComplete Then
        DoTheThing
    End If
End If
End Sub
1个回答

0

CustomPropertyChange事件在项的自定义属性(它是父对象的实例)更改时触发。要处理该事件,您必须单独订阅Outlook中的每个项,这不是一个好主意。更好的解决方案是订阅Items类的ItemChange事件,当指定集合中的项更改时触发。在这种情况下,您可以监视文件夹,而不是单个文件夹。但它不会告诉您更改了哪个属性。但是,您可以保留两个自定义属性以同步值(第一个用于源属性值,第二个用于旧值),因此您将能够确定更改了哪个属性以及旧值是什么。

作为一种解决方法,您可以考虑使用Outlook基于的低级API - Extended MAPI。在那里,您可以找到fnevObjectModified通知。有关更多信息,请参阅MAPI中的事件通知。请注意,您可以使用托管代码周围的任何包装器来访问低级别通知(例如,Redemption或MAPI存储访问器)。

订阅每个 Outlook 项目单独订阅为什么不是一个好主意?这会减慢速度吗? - Empiromancer
当然了,你必须尽快释放COM对象,避免一直保持它们的存活状态。 - Eugene Astafiev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接