#c# #events #event-handling #vsto #outlook-addin
Вопрос:
Я пишу надстройку Outlook и подключаюсь к событию AttachmentAdd элемента MailItem. Это работает, как и ожидалось, когда составляется одно электронное письмо, но когда одновременно составляется несколько электронных писем, кажется, что событие AttachmentAdd срабатывает только для первого электронного письма, к которому добавляется вложение.
Я не уверен, имеет ли это какое-либо отношение к тому, что RCW выходит за рамки.
Я использую 64-разрядную версию Outlook 365, если это поможет.
Вот код:
public partial class MyAddIn
{
private void OutlookAddIn_Startup(object sender, System.EventArgs e)
{
Application.ItemLoad = NewItem_Load;
}
private void NewItem_Load(object item)
{
Outlook.MailItem newMailItem = null;
newMailItem = item as Outlook.MailItem;
if (newMailItem != null)
{
newMailItem.AttachmentAdd -= MailItem_AttachmentAdd;
newMailItem.AttachmentAdd = MailItem_AttachmentAdd;
}
}
// This gets called only for one email.
private void MailItem_AttachmentAdd(Outlook.Attachment attachment)
{
// Do some stuff here.
}
private void OutlookAddIn_Shutdown(object sender, System.EventArgs e)
{
Application.ItemLoad -= NewItem_Load;
// Log
}
protected override Microsoft.Office.Core.IRibbonExtensibility CreateRibbonExtensibilityObject()
{
return new MyRibbon(this);
}
#region VSTO generated code
private void InternalStartup()
{
this.Startup = new System.EventHandler(OutlookAddIn_Startup);
this.Shutdown = new System.EventHandler(OutlookAddIn_Shutdown);
AppDomain.CurrentDomain.UnhandledException = CurrentDomain_UnhandledException;
}
}
Ответ №1:
Вы настраиваете события обработчиком событий в локальной переменной ( newMailItem
), которая будет выпущена в какой-то момент после NewItem_Load()
выхода.
Переменная должна оставаться живой, чтобы вызывать события. Вы можете переместить объявление на уровень класса, но у вас может быть более одного открытого элемента. Попробуйте создать класс-оболочку, который содержит MailItem
в качестве своего члена, и сохраните эту оболочку в списке.
Комментарии:
1. Я действительно думал об этом, но проблема в том, что я не знаю, когда выпустить ссылку на MailItem. Это работает, когда я сохраняю элемент почты в списке. Кроме того, в этом случае я подключаюсь к событию загрузки элементов, когда я действительно хочу подключиться к событию создания новой почты.
2. Вы можете использовать
MailItem.Close
событие. Для новых элементов используйтеInspectors.NewInspector
событие.3. Кстати, есть ли событие, когда будет получен ответ/ответ/переадресация и электронное письмо загрузится из проводника?
4. Да.
Explorer.InlineResponse
иExplorer.InlineResponseClose
события. Вы можете увидеть эти события в прямом эфире в OutlookSpy ( dimastr.com/outspy )