Исчезают обработчики событий Reply, Reply-All и Forward в надстройке Outlook? - PullRequest
0 голосов
/ 12 июля 2020

Я пытаюсь перехватить события из моей надстройки VSTO для Outlook 2007, когда активированы команды Reply / Reply-All / Forward windows. Итак, я делаю это:

private void ThisAddIn_Startup(object sender, System.EventArgs e)
{
    this.Application.ItemLoad += new Microsoft.Office.Interop.Outlook.ApplicationEvents_11_ItemLoadEventHandler(onItemLoad);
}

Outlook.ItemEvents_10_Event gObj_itemEvt = null;

private void onItemLoad(object Item)
{
    gObj_itemEvt = (Outlook.ItemEvents_10_Event)Item;

    gObj_itemEvt.Reply += new Microsoft.Office.Interop.Outlook.ItemEvents_10_ReplyEventHandler(on_Reply);
    gObj_itemEvt.ReplyAll += new Microsoft.Office.Interop.Outlook.ItemEvents_10_ReplyAllEventHandler(on_ReplyAll);
    gObj_itemEvt.Forward += new Microsoft.Office.Interop.Outlook.ItemEvents_10_ForwardEventHandler(on_Forward);
}

private void on_Reply(object Item, ref bool cancel)
{
    //Called when user loads Reply window
    LogMessage("Reply opened");
}

private void on_ReplyAll(object Item, ref bool cancel)
{
    //Called when user loads Reply-All window
    LogMessage("Reply-All opened");
}

private void on_Forward(object Item, ref bool cancel)
{
    //Called when user loads Forward window
    LogMessage("Forward opened");
}

Это работает несколько раз, но затем останавливается. В этом случае я все еще получаю onItemLoad события, но on_Reply, on_ReplyAll и on_Forward больше не транслируются.

Что я здесь делаю не так?

1 Ответ

0 голосов
/ 12 июля 2020

Вы определяете один объект как источник таких событий, как Reply, ReplyAll или Forward. Это означает, что для обработки этих событий можно открыть только один элемент. Представим себе следующий сценарий, когда открываются два элемента и запускается событие ItemLoad. В случае с первым элементом все прошло хорошо и исходный элемент настроен правильно. Но второе событие приводит к перезаписи исходного элемента, поэтому вы больше не будете удерживать ссылку на первый элемент и не получите для него событий. Если вы хотите обрабатывать события для всех открытых элементов Outlook, вам необходимо вести список объектов вместо ссылки на один объект:

private void ThisAddIn_Startup(object sender, System.EventArgs e)
{
    this.Application.ItemLoad += new Microsoft.Office.Interop.Outlook.ApplicationEvents_11_ItemLoadEventHandler(onItemLoad);
}

List<Outlook.ItemEvents_10_Event> gObj_itemEvtList = new List<Outlook.ItemEvents_10_Event>();

private void onItemLoad(object Item)
{
    ItemEvents_10_Event gObj_itemEvt = (Outlook.ItemEvents_10_Event)Item;

    gObj_itemEvt.Reply += new Microsoft.Office.Interop.Outlook.ItemEvents_10_ReplyEventHandler(on_Reply);
    gObj_itemEvt.ReplyAll += new Microsoft.Office.Interop.Outlook.ItemEvents_10_ReplyAllEventHandler(on_ReplyAll);
    gObj_itemEvt.Forward += new Microsoft.Office.Interop.Outlook.ItemEvents_10_ForwardEventHandler(on_Forward);

   gObj_itemEvtList.Add(gObj_itemEvt);
}

private void on_Reply(object Item, ref bool cancel)
{
    //Called when user loads Reply window
    LogMessage("Reply opened");
}

private void on_ReplyAll(object Item, ref bool cancel)
{
    //Called when user loads Reply-All window
    LogMessage("Reply-All opened");
}

private void on_Forward(object Item, ref bool cancel)
{
    //Called when user loads Forward window
    LogMessage("Forward opened");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...